我试图在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'
答案 0 :(得分:0)
来自http://python-3-patterns-idioms-test.readthedocs.io/en/latest/Metaprogramming.html
Python 3更改了元类钩子。它不会禁用
__metaclass__
字段,但会忽略它。相反,您在基类列表中使用关键字参数:
在您的情况下,您必须更改为:
class Boo(object, metaclass = BooType):
pass
这是有效的。但是,这种语法与python 2不兼容。
在http://python-future.org/compatible_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)):
pass