Ответ 1
Python 3 изменил способ указания метакласса, __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.with_metaclass()
BaseClass генератора или на @six.add_metaclass()
класс декоратор указать метакласса.