您正在描述的基本用法__init_subclass__
hook (docs https://docs.python.org/3/reference/datamodel.html#customizing-class-creation):
每当一个类继承另一个类时,__init_subclass__
被该类调用。这样,就可以编写改变子类行为的类。
>>> class A:
... def __init_subclass__(cls):
... print(f"init {cls}")
...
>>> class B(A):
... pass
...
init <class '__main__.B'>
See PEP 487 -- 更简单地自定义类创建 https://www.python.org/dev/peps/pep-0487/了解更多信息。
Note:这是 3.6+ 的功能。在较旧的 Python 版本中,使用元类__new__
达到同样的目的:
>>> class MyMeta(type):
... def __new__(meta, name, bases, class_dict):
... print("MyMeta.__new__", meta, name, bases, class_dict)
... return type.__new__(meta, name, bases, class_dict)
...
>>> class A(metaclass=MyMeta):
... pass
...
MyMeta.__new__ <class '__main__.MyMeta'> A () {'__module__': '__main__', '__qualname__': 'A'}
>>> class B(A):
... pass
...
MyMeta.__new__ <class '__main__.MyMeta'> B (<class '__main__.A'>,) {'__module__': '__main__', '__qualname__': 'B'}