我在__metaclass__
类的属性和实际继承之间有很多混淆,以及__new__
在这两种情况下如何调用。我的问题来自于挖掘 django 框架中的一些模型代码。
假设我想将一个属性附加到一个类,因为它是在孩子的Meta
子类中定义的:
class Parent(type):
def __new__(cls, name, base, attrs):
meta = attrs.pop('Meta', None)
new_class = super(Parent, cls).__new__(cls, name, base, attrs)
new_class.fun = getattr(meta, 'funtime', None)
return new_class
我不明白为什么__new__
在 django 的代码中调用实际方法,但是当我尝试编写类似的代码时它不起作用。
根据我的经验,以下实际上并没有调用__new__
父级的方法:
class Child(Parent):
class Meta:
funtime = 'yaaay'
C = Child()
当我尝试这样做时,它会抱怨 TypeError:
TypeError: __new__() takes exactly 4 arguments (1 given)
但是,我一直在查看的源代码似乎以这种方式工作。
我知道可以使用元类来完成:
class Child(object):
__metaclass__ = Parent
但我不明白为什么他们的方式适用于他们而不适用于我,因为非__metaclass___
用于制作可分发模块会更清洁。
有人可以指出我所缺少的正确方向吗?
谢谢!