我在Python 2.7中使用元类。所以我创建了一个如下代码:
class M(type):
def __new__(meta, name, parents, attrs):
print 'In meta new'
return super(meta, meta).__new__(meta, name, parents, attrs)
def __init__(cls, *args, **kwargs):
print 'In meta init'
def __call__(cls, *attr, **val):
print 'In meta call'
return super(cls, cls).__new__(cls)
class A(object):
__metaclass__ = M
def __new__(cls):
print 'In class new'
return super(cls, cls).__new__(cls)
def __init__(self):
print 'In object init'
def __call__(self):
print 'In object call'
但输出让我困惑:
A()
In meta new
In meta init
In meta call
以某种方式重写了类方法__ new __和__ init __,因此解释器只是跳过它们。任何人都可以解释这个东西吗?
感谢您的帮助。
答案 0 :(得分:1)
您未正确调用super()
。 super()
的第一个参数应该是类本身,而不是它的实例。
return super(meta, meta).__new__(meta, name, parents, attrs)
应该是......
return super(M, meta).__new__(meta, name, parents, attrs)
对于其他super()
次调用,等等 - 第一个参数应该是他们所在的类;第二个是实际的实例。
答案 1 :(得分:0)
它不起作用,因为我不使用原始Python机制 - cls()
,它保证了__new__
和__init__
方法的自动运行,它被元类{{1}覆盖方法,它不会这样做。