2016-04-26 4 views
1
class UpperAttrMetaclass(type): 
    def __new__(cls, name, bases, attrs): 
     attrs["b"] = 77 
     return super(UpperAttrMetaclass, cls).__new__(cls, name, bases, attrs) 

class Cls(object): 
    __metaclass__ = UpperAttrMetaclass 

f = Cls() 
print(f.b) 

Я попытался запустить этот код на Python 3.4.3 и 2.7.11. В 2.7.11 работает хорошо (выход - 77), но 3.4.3 бросок Атрибут ОшибкаMetaclass configure. Конфликт версий Python

Вот результат (3.4.3)

Traceback (most recent call last): 
    File "D:/LABS/BSUIR_labs/4cem/PYTHON/lab2/meta.py", line 8, in <module> 
    print(f.b) 
AttributeError: 'Cls' object has no attribute 'b' 

Process finished with exit code 1 

Как я могу это исправить? метаклассы работают по-разному?

ответ

1

В Python3, вы объявляете метакласса инлайн:

class Cls(object, metaclass=UpperAttrMetaclass): 
    ... 

Я думаю, что 2to3 должен справиться с этим, но если вам нужна поддержка как в том же исходном файле без использования 2to3, то вы, вероятно, хотите какая-то библиотека. six является де-факто стандартом здесь. Вы хотите использовать six.with_metaclass:

import six 
class Cls(six.with_metaclass(UpperAttrMetaclass, object)): 
    ... 

 Смежные вопросы

  • Нет связанных вопросов^_^