How can we get the default behavior of __repr__()? How can we get the default behavior of __repr__()? python python

How can we get the default behavior of __repr__()?


You can use object.__repr__(obj). This works because the default repr behavior is defined in object.__repr__.


Note, the best answer is probably just to use object.__repr__ directly, as the others have pointed out. But one could implement that same functionality roughly as:

>>> def true_repr(x):...     type_ = type(x)...     module = type_.__module__...     qualname = type_.__qualname__...     return f"<{module}.{qualname} object at {hex(id(x))}>"...

So....

>>> A()hahahahaha>>> true_repr(A())'<__main__.A object at 0x106549208>'>>>


Typically we can use object.__repr__ for that, but this will to the "object repr for every item, so:

>>> object.__repr__(4)'<int object at 0xa6dd20>'

Since an int is an object, but with the __repr__ overriden.

If you want to go up one level of overwriting, we can use super(..):

>>> super(type(4), 4).__repr__()  # going up one level'<int object at 0xa6dd20>'

For an int that thus again means that we will print <int object at ...>, but if we would for instance subclass the int, then it would use the __repr__ of int again, like:

class special_int(int):    def __repr__(self):        return 'Special int'

Then it will look like:

>>> s = special_int(4)>>> super(type(s), s).__repr__()'4'

What we here do is creating a proxy object with super(..). Super will walk the method resolution order (MRO) of the object and will try to find the first function (from a superclass of s) that has overriden the function. If we use single inheritance, that is the closest parent that overrides the function, but if it there is some multiple inheritance involved, then this is more tricky. We thus select the __repr__ of that parent, and call that function.

This is also a rather weird application of super since usually the class (here type(s)) is a fixed one, and does not depend on the type of s itself, since otherwise multiple such super(..) calls would result in an infinite loop.

But usually it is a bad idea to break overriding anyway. The reason a programmer overrides a function is to change the behavior. Not respecting this can of course sometimes result into some useful functions, but frequently it will result in the fact that the code contracts are no longer satisfied. For example if a programmer overrides __eq__, he/she will also override __hash__, if you use the hash of another class, and the real __eq__, then things will start breaking.

Calling magic function directly is also frequently seen as an antipattern, so you better avoid that as well.