【发布时间】:2012-03-22 10:20:38
【问题描述】:
如何在 python 中覆盖类属性访问?
附:有没有办法单独保留对类属性的常规访问,但在缺少属性时调用更具体的异常?
【问题讨论】:
标签: python attributes
如何在 python 中覆盖类属性访问?
附:有没有办法单独保留对类属性的常规访问,但在缺少属性时调用更具体的异常?
【问题讨论】:
标签: python attributes
当实例/类/父类上不存在该属性时,会调用__getattr__ 魔术方法。您可以使用它为缺少的属性引发特殊异常:
class Foo:
def __getattr__(self, attr):
# only called when self.attr doesn't exist
raise MyCustonException(attr)
如果要自定义访问类属性,需要在元类/类型上定义__getattr__:
class BooType(type):
def __getattr__(self, attr):
print attr
return attr
class Boo(metaclass=BooType):
pass
boo = Boo()
Boo.asd # prints asd
boo.asd # raises an AttributeError like normal
如果要自定义all属性访问,请使用__getattribute__魔术方法。
【讨论】:
class Boo(object): 代码不适用于 Python3,请使用 class Boo(metaclass=BooType): pass
agf's answer 是正确的,事实上我即将给出的答案是基于它并且欠它一些功劳。
只是为了提供更多关于类属性方面的详细信息,这是此处实际存在问题的部分(与 __getattr__ 和 __getattribute__ 之间的区别相反),我想添加对 @ 的引用987654322@,其中更详细地介绍了类和实例属性之间的区别、如何实现以及为什么需要使用元类来影响类属性查找。
【讨论】: