簡體   English   中英

Python 3 中的 __metaclass__

[英]__metaclass__ in Python 3

在 Python2.7 中,這段代碼可以很好地工作, MetaTable __getattr__將運行。 但是在 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更改了指定元類的方式,不再檢查__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()基類生成器@six.add_metaclass()類裝飾器來指定元類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM