__metaclass__属性和metaclass kwarg有什么区别

时间:2018-11-29 19:22:44

标签: python python-3.x

class属性__metaclass__和class关键字参数metaclass有什么区别。

考虑以下示例:

class Meta1(type):
    def __new__(cls, name, bases, attrs):
        attrs.update({'x': 100})
        return super().__new__(cls, name, bases, attrs)


class Foo(metaclass=Meta1):
    pass


class Bar(object):
    __metaclass__ = Meta1



f = Foo()
b = Bar()

f.x
>> 100
b.x
>> AttributeError: 'Bar' object has no attribute 'x'

我曾经认为FooBar实例在功能上是等效的,但显然它们不是相同的。

1 个答案:

答案 0 :(得分:4)

__metaclass__属性是用于声明元类的python2语法。 metaclass= kwarg是python3语法。

如果您需要一个代码库来同时支持python2和python3,则可以使用future,它具有a helper for this