When implementing a class in Python, you usually implement the __repr__ and __str__ methods.
- __str__ should print a readable message
- __repr__ should print a message that is unambigous (e.g. name of an identifier, class name, etc).
You can see __str__ as a method for users and __repr__ as a method for developers.
Here is an implementation example for a class that simply stores an attribute (data).
class Length(): def __init__(self, data): self.data = data |
__str__ is called when a user calls the print() function while __repr__ is called when a user just type the name of the instance:
>>> l = Length([1,2,3]) >>> print(l) # should call __str__ if it exists <__main__.Length at 0x7faf240acc18> >>> l <__main__.Length object at 0x7faf240acc18> |
By default when no __str__ or __repr__ methods are defined, the __repr__ returns the name of the class (Length) and __str__ calls __repr__.
Now, let us define the __repr__ method ourself to be more explicit:
class Length(): def __init__(self, data): self.data = data def __repr__(self): return "Length(%s) " % (len(self.data)) |
we could use it as follows:
>>> l = Length([1,2,3]) >>> print(l) # calls __str__ Length(3) >>> l # calls __repr__ Length(3, 140175447410224) |
When using the print() function in Python, the __str__ is called (if found) and otherwise, __repr__.
class Length(): def __init__(self, data): self.data = data def __repr__(self): return "Length(%s, %s) " % (len(self.data), id(self)) def __str__(self): return "Length(%s) " % (len(self.data)) |
so now __repr__ and __str__ have different behaviours:
>>> l = Length([1,2,3]) >>> print(l) # calls __str__ Length(3) >>> l # calls __repr__ Length(3, 140175447410224) |
3 Responses to Difference between __repr__ and __str__ in Python