如何在python中覆盖类属性访问?

时间:2012-03-22 10:20:38

标签: python attributes

如何在python中覆盖类属性访问?

P.S。有没有办法单独保留对类属性的常规访问权限,但是在缺少属性时调用更具体的异常?

2 个答案:

答案 0 :(得分:16)

当实例/类/父类上不存在该属性时,将调用__getattr__魔术方法。您将使用它为缺少的属性引发特殊异常:

class Foo(object):
    def __getattr__(self, attr):
        #only called what self.attr doesn't exist
        raise MyCustonException(attr)

如果要自定义对类属性的访问,则需要在元类/类型上定义__getattr__

class BooType(type):
    def __getattr__(self, attr):
        print attr
        return attr

class Boo(object):
    __metaclass__ = BooType

boo = Boo()
Boo.asd # prints asd
boo.asd # raises an AttributeError like normal

如果您想自定义所有属性访问权限,请使用__getattribute__魔术方法。

答案 1 :(得分:2)

agf's answer是正确的,事实上我要给出的答案是基于它并且归功于它。

只是为了提供关于类属性方面的更多细节,这是实际存在问题的部分(而不是__getattr____getattribute__之间的差异),我想添加对an answer I wrote to a different similar question的引用,它详细介绍了类和实例属性之间的区别,如何实现它,以及为什么需要使用元类来影响类属性查找。