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

时间:2012-10-26 07:24:01

标签: python oop metaclass

我在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 __,因此解释器只是跳过它们。任何人都可以解释这个东西吗?

感谢您的帮助。

2 个答案:

答案 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}覆盖方法,它不会这样做。