具有自定义元类行为的Python元类

2024-04-20 01:38:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在玩Python2.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被重写了,所以解释器跳过它们。有人能解释一下吗?你知道吗

谢谢你的帮助。你知道吗


Tags: nameinnewreturnobjectinitdefcall
2条回答

它不工作是因为我没有使用原始Python机制cls(),它保证了__new____init__方法的自动工作,它被元类__call__方法覆盖,而元类__call__方法则不这样做。你知道吗

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

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

应该是。。。你知道吗

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

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

相关问题 更多 >