1

我正在使用 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 __ 被覆盖了,所以解释器只是跳过它们。任何人都可以解释这些东西吗?

谢谢你的帮助。

4

2 回答 2

1

你打错电话了super()。的第一个参数super()应该是类本身,而不是它的实例。

return super(meta, meta).__new__(meta, name, parents, attrs)

应该...

return super(M, meta).__new__(meta, name, parents, attrs)

对于其他调用,依此类推super()——第一个参数应该是它们所在的类;第二个是实际实例。

于 2012-10-26T07:26:08.647 回答
0

它不起作用,因为我不使用原始 Python 机制 - cls(),它保证了__new__and__init__方法的自动工作,它被元类__call__方法覆盖,它不做同样的事情。

于 2012-11-15T12:54:52.487 回答