子クラスの __repr__ を親クラスで拡張する

たとえば継承していることを警告したい場合とかに使える。 実装はこのようになる。

class C:
    def __init_subclass__(cls, *args, **kwargs):
        super().__init_subclass__(*args, **kwargs)
        original = cls.__repr__
        def extended_repr(self):
            return f'{original(self)}(parent is {super().__thisclass__.__name__})'
        cls.__repr__ = extended_repr


class A(C):
    def __repr__(self):
        return 'This is A instance.'


assert repr(A()) == 'This is A instance.(parent is C)'

__new__ だと上書きできないので __init_subclass__ を使って拡張することになる。 なぜかはよくわからないのでドキュメントを熟読するしかないのである。