Сегодня я задал вопрос, в котором мне нужно было только решение моей проблемы. Я ожидал использования метаклассов, но получил что-то другое, и это сработало. Однако теперь меня интересует кое-что, связанное с моим предыдущим вопросом: почему мой метакласс не работал?

Вот ссылка на мой предыдущий вопрос, но вам не обязательно ее читать, чтобы ответить на этот вопрос: Как создать простой метакласс?

Итак, позвольте мне задать этот вопрос еще раз, на этот раз по совершенно другой причине: как создать простой метакласс? Вот что у меня есть, и я не понимаю, почему это не работает.

class MyMeta(type):
    def __new__(mcls, name, bases, attrs):
        attrs['my_attr'] = True     
        return super().__new__(mcls, name, bases, attrs)

class MyClass:
    __metaclass__ = MyMeta

print(MyClass.my_attr)

Последняя строка выводит следующую ошибку:

AttributeError: type object 'MyClass' has no attribute 'my_attr'
0
user2032433 5 Апр 2013 в 19:29
Вы здесь используете Python 3? Вы используете print() как функцию ..
 – 
Martijn Pieters
5 Апр 2013 в 19:30
Да, я использую Python 3. Очевидно, ошибка не связана с печатью. В нем ясно сказано, что не так, я просто не знаю почему.
 – 
user2032433
5 Апр 2013 в 19:30
1
Вы должны объявить class MyClass(metaclass=MyMeta): на Python 3
 – 
JBernardo
5 Апр 2013 в 19:32
Спасибо, сработало :)
 – 
user2032433
5 Апр 2013 в 19:34
@MarkusMeskanen: Причина, по которой я спросил, заключалась в том, что синтаксис для метаклассов отличается от 2 до 3, и я хотел убедиться, о какой версии мы здесь говорим.
 – 
Martijn Pieters
5 Апр 2013 в 19:35

1 ответ

Лучший ответ

В Python 3 вы указываете метакласс по-другому:

class MyClass(metaclass=MyMeta):
    pass
0
Martijn Pieters 5 Апр 2013 в 19:32
Черт возьми, я прочитал десятки руководств по метаклассам и просто следил за тем, что я узнал от них, даже не заглядывая в документацию по python ... Похоже, все учебники были для Python 2. Спасибо, теперь это сработало. :)
 – 
user2032433
5 Апр 2013 в 19:33