gpt4 book ai didi

python - Python 3 中的 __metaclass__

转载 作者:太空狗 更新时间:2023-10-29 17:53:25 27 4
gpt4 key购买 nike

在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com