__Python 3中的元类

__Python 3中的元类,python,metaclass,Python,Metaclass,在Python2.7中,这段代码可以很好地工作,元表中的\uuu getattr\uuuu 我会跑的。但在Python3中,它不起作用 class MetaTable(type): def __getattr__(cls, key): temp = key.split("__") name = temp[0] alias = None if len(temp) > 1: alias = tem

在Python2.7中,这段代码可以很好地工作,
元表中的
\uuu getattr\uuuu
我会跑的。但在Python3中,它不起作用

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'
回溯(最近一次呼叫最后一次):
文件“/Users/wyx/project/python3/sql/dd.py”,第31行,在
d、 学生
AttributeError:类型对象“Table”没有属性“student\u”
Python3,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
不再被选中

在类签名中使用
元类=…

演示:

类元表(类型): ... def_u_getattr__(cls,键): ... temp=键拆分(“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu ... name=temp[0] ... 别名=无 ... 如果透镜(温度)>1: ... 别名=温度[1] ... 返回cls(名称、别名) ... >>>类表(对象,元类=元表): ... def uuu init uuuu(self,name,alias=None): ... self.\u name=name ... self.\u别名=别名 ... >>>d=表格 >>>博士生

如果需要在代码库中同时支持Python 2和Python 3,可以使用或来指定元类。

谢谢。它让我最喜欢的插件系统在Python3中工作。
可以保留现有的_元类_;语法
@CodeFarmer:是的,但它不再起任何作用了。
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>