python - Python 3 中的 __metaclass__

标签 python metaclass

在 Python2.7 中,这段代码可以很好地工作, __getattr__ in MetaTable 会跑。但在 Python 3 中它不起作用。

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'

最佳答案

python 3 changed how you specify a 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.with_metaclass() baseclass generator@six.add_metaclass() class decorator指定元类。

关于python - Python 3 中的 __metaclass__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39013249/

相关文章:

java - Groovy 中的克隆和扩展类

由类型创建的类的Python元类

python - `__metaclass__ = type` 的目的是什么?

javascript - 在浏览器中运行 C

python - 安全使用 eval() 或替代方法 - python

python - Django 'TestMiddleware' 对象没有属性 'get_response'

python - 经过训练的 TensorFlow 模型始终输出零

具有 fork/join 功能的 Java 工作流程

python - 具有集成查询集的子类 Django 模型

unit-testing - 通过metaClass覆盖grails Controller 链方法无效