python - 元类 __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 属性中。
在这种情况下,这是什么原因以及如何向实例添加属性?谢谢!
解决方案
它们作为实例属性添加。然而,实例是类,作为元类的一个实例。您没有为;定义__init__
方法 E
您正在定义type
用于初始化E
自身的方法。
如果您只想将属性添加到 的实例中E
,那么您的工作级别错误;你应该定义一个mixin并为此使用多重继承。
推荐阅读
- react-native - [未处理的承诺拒绝:错误:预期的 URL 方案“http”或“https”但是“文件”]
- python - 将 Python .exe 文件发送到没有 Python 的机器
- php - 如何在php中的数组中设置逗号?
- react-native - 当模态在本机中打开时,我如何单击模态后面的组件
- visual-studio-2015 - SSIS 约束
- autodesk-forge - 在伪造查看器上加载和运行扩展
- ruby-on-rails - Rails ActiveRecord - 字段验证
- vuejs2 - 如何制作未知的vue-model数组?
- java - JUnit 方法的执行顺序混乱
- spring - spring feign客户端的分页和标准