首页 > 解决方案 > 元类 __init__ 中 setattr() 的意外行为

问题描述

这是Metaclass提供自定义的基本内容__init__

class D(type):
    def __init__(cls, name, bases, attributes):
        super(D, cls).__init__(name, bases, attributes)
        for hook in R.registered_hooks:
            setattr(cls, hook.__qualname__, hook)

for 循环遍历函数列表,调用setattr(cls, hook.__qualname__, hook)其中的每一个。

这是一个使用上述元类的类:

class E(metaclass=D):
    def __init__(self):
        pass

奇怪的事:

E().__dict__   prints {}

但是当我打电话

`E.__dict__   prints {'f1': <function f1 at 0x001>, 'f2': <function f2 at 0x002>}`

我期待将这些函数作为属性添加到实例属性中,因为__init__它为 Class 提供了自定义初始化,但似乎属性已添加到Class 属性中。

在这种情况下,这是什么原因以及如何向实例添加属性?谢谢!

标签: pythonpython-3.xmetaclass

解决方案


它们作为实例属性添加。然而,实例是,作为元类的一个实例。您没有为;定义__init__方法 E您正在定义type用于初始化E自身的方法。

如果您只想将属性添加到 的实例中E,那么您的工作级别错误;你应该定义一个mixin并为此使用多重继承。


推荐阅读