[英]__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.