我正在试图覆盖python3中的类属性访问。我已经找到这个问题了,answered for python2。但与Python3不同的是,情况并非如此。请帮助我理解为什么这不适用于Python3,以及如何使它工作。
下面是我试图在Python3中验证的代码:
class BooType(type):
def __getattr__(self, attr):
print(attr)
return attr
class Boo(object):
__metaclass__ = BooType
boo = Boo()
Boo.asd #Raises AttributeError in Python3 where as in Python2 this prints 'asd'发布于 2017-10-25 14:53:04
来自http://python-3-patterns-idioms-test.readthedocs.io/en/latest/Metaprogramming.html
Python 3改变了元类钩子。它并不不允许
__metaclass__字段,但它忽略它。相反,在基类列表中使用关键字参数:
在您的情况下,您必须更改为:
class Boo(object, metaclass = BooType):
pass而且这很管用。不过,这个语法与python 2不兼容。
有一种方法可以创建兼容的代码,在idioms.html#metaclasses中可以看到
# Python 2 and 3:
from six import with_metaclass
# or
from future.utils import with_metaclass
class Boo(with_metaclass(BooType, object)):
passhttps://stackoverflow.com/questions/46926658
复制相似问题