16.17. OOP Stringify Repr

  • Calling function repr(obj) calls obj.__repr__()

  • Method obj.__repr__() must return str

  • Dedicated for developers

  • Shows object representation

  • Copy-paste for creating object with the same values

  • Useful for debugging

  • Printing list will call __repr__() method on each element

16.17.1. Inherited

Object without __repr__() method overloaded prints their memory address:

>>> class User:
...     def __init__(self, firstname, lastname):
...         self.firstname = firstname
...         self.lastname = lastname
...
...
>>> mark = User('Mark', 'Watney')
>>> mark  
<__main__.User object at 0x10aef7450>
>>> repr(mark)  
'<__main__.User object at 0x10aef7450>'
>>> mark.__repr__()  
'<__main__.User object at 0x10aef7450>'
>>> f'{mark!r}'  
'<__main__.User object at 0x10aef7450>'

16.17.2. Overloaded

>>> class User:
...     def __init__(self, firstname, lastname):
...         self.firstname = firstname
...         self.lastname = lastname
...
...     def __repr__(self):
...         firstname = self.firstname
...         lastname = self.lastname
...         return f'User({firstname=}, {lastname=})'
...
...
>>> mark = User('Mark', 'Watney')
>>> mark
User(firstname='Mark', lastname='Watney')
>>> repr(mark)
"User(firstname='Mark', lastname='Watney')"
>>> mark.__repr__()
"User(firstname='Mark', lastname='Watney')"
>>> f'{mark!r}'
"User(firstname='Mark', lastname='Watney')"

16.17.3. Assignments

Code 16.25. Solution
"""
* Assignment: OOP Stringify Repr
* Type: class assignment
* Complexity: easy
* Lines of code: 3 lines
* Time: 5 min

English:
    1. Overload `repr()`
    2. Run doctests - all must succeed

Polish:
    1. Przeciąż `repr()`
    2. Uruchom doctesty - wszystkie muszą się powieść

Tests:
    >>> import sys; sys.tracebacklimit = 0
    >>> from inspect import isclass, ismethod

    >>> assert isclass(Iris)
        >>> iris = Iris(DATA)

    >>> assert hasattr(Iris, '__repr__')
    >>> assert ismethod(iris.__repr__)
    >>> repr(iris)
    "Iris(values=[4.7, 3.2, 1.3, 0.2], species='setosa')"
"""

DATA = (4.7, 3.2, 1.3, 0.2, 'setosa')


# repr() -> Iris(values=[4.7, 3.2, 1.3, 0.2], species='setosa')
class Iris:
    values: list
    species: str

    def __init__(self, data):
        self.values = list(data[:-1])
        self.species = str(data[-1])