В чем разница между атрибутом класса __metaclass__ и аргументом ключевого слова класса 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'

Я думал, что экземпляры Foo и Bar будут функционально эквивалентны, но, очевидно, это не так.

1
rsiemens 29 Ноя 2018 в 22:22

1 ответ

Лучший ответ

Атрибут __metaclass__ - это синтаксис Python2 для объявления метакласса. metaclass= kwarg - это синтаксис Python3.

Если вам нужна одна база кода для поддержки как python2, так и python3, вы можете использовать future, в котором есть помощник для этого.

4
wim 29 Ноя 2018 в 19:31