Kra*_*eng 4 python methods inheritance subclass
该__init__方法定义在创建类的实例时要执行的操作。创建子类时,我可以做一些等效的事情吗?
假设我有抽象类Entity:
class Entity:
def __onsubclasscreation__(cls):
for var in cls.__annotations__:
cls.__dict__[var] = property(lambda self:self.vars[var])
Run Code Online (Sandbox Code Playgroud)
这意味着每当我定义一个继承自的新类Entity时,该类的所有带注释的变量都将收到一个吸气剂:
class Train(Entity):
wagons: int
color: str
>>> t = Train()
>>> t.vars["wagons"] = 5
>>> t.wagons
5
Run Code Online (Sandbox Code Playgroud)
我无法在实例化上执行此操作,因为属性需要在类中定义,而我无法在超类中执行,因为我不知道需要哪些属性。有什么办法可以动态地创建子类吗?
您正在描述__init_subclass__hook(docs)的基本用法:
每当一个类从另一个类继承时,
__init_subclass__就会对该类进行调用。这样,可以编写更改子类行为的类。
>>> class A:
... def __init_subclass__(cls):
... print(f"init {cls}")
...
>>> class B(A):
... pass
...
init <class '__main__.B'>
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参见PEP 487-类创建的更简单定制。
注意:这是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'}
Run Code Online (Sandbox Code Playgroud)