我想为元类创建的每个类添加一个属性。例如,创建名为C
的类时,我想添加一个属性C._C__sup
,其值为描述符super(C)
。Python __超级黑魔法失败
这里是我试过:
class Meta(type):
def __init__(cls, name, bases, dict): # Not overriding type.__new__
cls.__dict__['_' + name + '__sup'] = super(cls)
# Not calling type.__init__; do I need it?
class C(object):
__metaclass__ = Meta
c = C()
print c._C__sup
这给了我:
TypeError: Error when calling the metaclass bases
'dictproxy' object does not support item assignment
一些背景资料:
(您不必阅读本部分)
启发通过this article,我在做什么尝试使用super
时避免“硬编码”之类的名字:
的思路是使用未绑定的超级对象作为私人 属性。
>>> C._C__sup = super(C)
的语法
self.__sup.meth
可以作为一种替代的方法,这里面定义:例如,在我们的例子中,我们可以在类C
为未绑定的超级对象super(C)
定义私有 属性__sup
到super(C, self).meth
。 的优点是避免重复调用 语法中类的名称,因为该名称隐藏在私人 名称的加密机制中。__sup
属性的创建可以隐藏在 元类中并自动创建。所以,这一切似乎工作:但 其实并非如此。