当一个类被另一个类扩展时,有没有办法在 Python 中执行一些代码?更准确地说,我想自动保留所有扩展基类的类的寄存器。因此,我想写这样的东西:
class Base:
subclasses = {}
@classmethod
def extending(cls, subclass):
cls.subclasses[subclass.__name__] = subclass
class Extend1(Base):
pass
class Extend2(Base):
pass
在这段代码之后,我希望 Base.subclasses 包含到两个扩展类的链接。
您能建议一种方法来完成这项工作吗?或者,也许,提供等效的解决方案?
最佳答案
这显然是元类的应用。也就是说,如果你想改变 C 类的行为,那么你应该改变 C 本身的类,它是一个元类,通常是 type
。这是解决方案的 stub :
class Meta(type):
def __new__(cls, clsname, bases, dct):
res = type.__new__(cls, clsname, bases, dct)
for cls in bases:
if isinstance(cls, Meta):
try:
cls.extending(res)
except AttributeError:
pass
return res
我从 type
继承来创建一个元类来拦截类的创建并将创建的类存储在基本 _subclass
属性中。然后用
class Base(object):
__metaclass__ = Meta
subclasses = {}
@classmethod
def extending(cls, subclass):
cls.subclasses[subclass.__name__] = subclass
class Extend1(Base):
pass
class Extend2(Base):
pass
然后
>>> Base.subclasses
{'Extend1': __main__.Extend1, 'Extend2': __main__.Extend2}
非常重要的一点:元类是inherited
(我认为这不是这里的正确术语)。因此 Extend1
和 Extend2
也是 Meta
的实例:
>>> type(Extend1)
<class '__main__.Meta'>
关于python - 在 Python 中扩展类时执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21756477/