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

Posted

技术标签:

【中文标题】具有自定义元类行为的 Python 元类【英文标题】:Python meta class with custom metaclass behavior 【发布时间】:2012-10-16 11:06:26 【问题描述】:

我正在使用 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 __ 被覆盖了,所以解释器只是跳过它们。谁能解释一下这些东西?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

您错误地调用了super()super() 的第一个参数应该是类本身,而不是它的实例。

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

应该是……

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于具有自定义元类行为的 Python 元类的主要内容,如果未能解决你的问题,请参考以下文章

2.自定义元类控制类的创建行为

面向对象,元类,控制类,对象的创建

1.元类介绍/2.自定义元类控制类的行为/3.控制类的实例化行为/4.控制类的实例化行为的应用

具有自定义元类的类的所有子类共享相同的属性,即使它们不应该

python中的元类作用?

元类,异常处理