如何在python3中覆盖类属性访问

时间:2017-10-25 07:40:37

标签: python-3.x

我试图在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'

1 个答案:

答案 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