__metaclass__ в Python3.5

В Python2.7 этот код может работать очень хорошо, __getattr__ в MetaTable будет работать. Но в Python 3.5 это не работает.

 class MetaTable(type): def __getattr__(cls, key): temp = key.split("__") name = temp[0] alias = None if len(temp) > 1: alias = temp[1] return cls(name, alias) class Table(object): __metaclass__ = MetaTable def __init__(self, name, alias=None): self._name = name self._alias = alias d = Table d.student__s 

Но в Python 3.5 вместо этого возникает ошибка атрибута:

 Traceback (most recent call last): File "/Users/wyx/project/python3/sql/dd.py", line 31, in <module> d.student__s AttributeError: type object 'Table' has no attribute 'student__s' 

One Solution collect form web for “__metaclass__ в Python3.5”

Python 3 изменил __metaclass__ метакласса , __metaclass__ больше не проверяется.

Использовать metaclass=... в подписи класса:

 class Table(object, metaclass=MetaTable): 

Демо-версия:

 >>> class MetaTable(type): ... def __getattr__(cls, key): ... temp = key.split("__") ... name = temp[0] ... alias = None ... if len(temp) > 1: ... alias = temp[1] ... return cls(name, alias) ... >>> class Table(object, metaclass=MetaTable): ... def __init__(self, name, alias=None): ... self._name = name ... self._alias = alias ... >>> d = Table >>> d.student__s <__main__.Table object at 0x10d7b56a0> 

Если вам нужна поддержка как Python 2, так и 3 в вашей кодовой базе, вы можете использовать генератор @six.add_metaclass() декоратор класса @six.add_metaclass() чтобы указать метакласс.

Interesting Posts

устаревшие типы контента, в то время как syncdb в Django

Django Rest Framework 3.4. Сериализация внешнего ключа и загрузка файла изображения

расширяя (добавляя строку или столбец) матрицу scipy.sparse

Несколько уровней «collection.defaultdict» в Python

'Библиотека не загружена: @ rpath / libcudart.7.5.dylib' Ошибка TensorFlow на Mac

Какие символы Unicode принимаются в именах переменных Python3?

Вычисление среднего квадратического смещения с использованием python и FFT

Python: как я могу проверить, существует ли ключ словаря?

Каков наиболее эффективный способ преобразования набора результатов MySQL в массив NumPy?

как преобразовать вложенный OrderedDict в dict?

Dataframe Slice не удаляет значения индекса

Flocks throwing «работает вне контекста запроса» при запуске подпотока

как я могу сгладить массив 2d numpy, который имеет разную длину во второй оси?

Python: запустить функцию из командной строки

Как использовать Matplotlib в Django?

Python - лучший язык программирования в мире.