How to print instances of a class using print()?
>>> class Test:... def __repr__(self):... return "Test()"... def __str__(self):... return "member of Test"... >>> t = Test()>>> tTest()>>> print(t)member of Test
The __str__
method is what gets called happens when you print it, and the __repr__
method is what happens when you use the repr()
function (or when you look at it with the interactive prompt).
If no __str__
method is given, Python will print the result of __repr__
instead. If you define __str__
but not __repr__
, Python will use what you see above as the __repr__
, but still use __str__
for printing.
As Chris Lutz mentioned, this is defined by the __repr__
method in your class.
From the documentation of repr()
:
For many types, this function makes an attempt to return a string that would yield an object with the same value when passed to
eval()
, otherwise the representation is a string enclosed in angle brackets that contains the name of the type of the object together with additional information often including the name and address of the object. A class can control what this function returns for its instances by defining a__repr__()
method.
Given the following class Test:
class Test: def __init__(self, a, b): self.a = a self.b = b def __repr__(self): return "<Test a:%s b:%s>" % (self.a, self.b) def __str__(self): return "From str method of Test: a is %s, b is %s" % (self.a, self.b)
..it will act the following way in the Python shell:
>>> t = Test(123, 456)>>> t<Test a:123 b:456>>>> print repr(t)<Test a:123 b:456>>>> print(t)From str method of Test: a is 123, b is 456>>> print(str(t))From str method of Test: a is 123, b is 456
If no __str__
method is defined, print(t)
(or print(str(t))
) will use the result of __repr__
instead
If no __repr__
method is defined then the default is used, which is pretty much equivalent to..
def __repr__(self): return "<%s instance at %s>" % (self.__class__.__name__, id(self))
A generic way that can be applied to any class without specific formatting could be done as follows:
class Element: def __init__(self, name, symbol, number): self.name = name self.symbol = symbol self.number = number def __str__(self): return str(self.__class__) + ": " + str(self.__dict__)
And then,
elem = Element('my_name', 'some_symbol', 3)print(elem)
produces
__main__.Element: {'symbol': 'some_symbol', 'name': 'my_name', 'number': 3}