python - 在 Python 中扩展类时执行代码

标签 python class subclass introspection

当一个类被另一个类扩展时,有没有办法在 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(我认为这不是这里的正确术语)。因此 Extend1Extend2 也是 Meta 的实例:

>>> type(Extend1)
<class '__main__.Meta'>

关于python - 在 Python 中扩展类时执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21756477/

相关文章:

python - 从 Scrapy 中排除 div

python - 查找 C 风格注释的正则表达式

c++ - 成员(member)功能 friend

python - 为什么我不能在 python3 中子类化元组?

ios - 使用 IBOutlets 正确设置 UIView 子类

python - 如何捕获 Django 400 错误

python - eclipse:运行/调试当前文件

php - 在类中包含类是不好的做法吗?

php - 我可以从类外部的特征中调用静态函数吗?

ios - 在 Swift 中从另一个 View Controller 呈现子类 View Controller