Difference between __getattr__ vs __getattribute__
我试图理解何时使用
在查看对象的实际属性之前调用
新样式类派生自
你几乎肯定想要
让我们来看看
每当您请求一个尚未定义的属性时,python将调用
1 2 3 4 5 6 7 8 9 | class Count(): def __init__(self,mymin,mymax): self.mymin=mymin self.mymax=mymax obj1 = Count(1,10) print(obj1.mymin) print(obj1.mymax) print(obj1.mycurrent) --> AttributeError: 'Count' object has no attribute 'mycurrent' |
。
现在我的类计数有
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Count: def __init__(self,mymin,mymax): self.mymin=mymin self.mymax=mymax def __getattr__(self, item): self.__dict__[item]=0 return 0 obj1 = Count(1,10) print(obj1.mymin) print(obj1.mymax) print(obj1.mycurrent1) |
埃多克斯1〔5〕
现在我们来看看
每当有人试图访问以子字符串"cur"开头的属性时,python就会引发
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Count: def __init__(self,mymin,mymax): self.mymin=mymin self.mymax=mymax self.current=None def __getattribute__(self, item): if item.startswith('cur'): raise AttributeError return object.__getattribute__(self,item) # or you can use ---return super().__getattribute__(item) obj1 = Count(1,10) print(obj1.mymin) print(obj1.mymax) print(obj1.current) |
。
重要提示:为了避免
如果类同时包含getattr和getattribute magic方法,则首先调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class Count(object): def __init__(self,mymin,mymax): self.mymin=mymin self.mymax=mymax self.current=None def __getattr__(self, item): self.__dict__[item]=0 return 0 def __getattribute__(self, item): if item.startswith('cur'): raise AttributeError return object.__getattribute__(self,item) # or you can use ---return super().__getattribute__(item) # note this class subclass object obj1 = Count(1,10) print(obj1.mymin) print(obj1.mymax) print(obj1.current) |
。
新样式类继承自
1 2 3 4 5 | class SomeObject(object): pass class SubObject(SomeObject): pass |
旧样式类不:
1 2 | class SomeObject: pass |
号
这只适用于python 2——在python 3中,以上所有内容都将创建新的样式类。
见9。类(python教程)、newclassvsclassicclass以及python中的旧样式类和新样式类之间的区别是什么?有关详细信息。
这只是一个基于内德·巴切尔德解释的例子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Foo(object): def __getattr__(self, attr): print"looking up", attr value = 42 self.__dict__[attr] = value return value f = Foo() print f.x #output >>> looking up x 42 f.x = 3 print f.x #output >>> 3 print ('__getattr__ sets a default value if undefeined OR __getattr__ to define how to handle attributes that are not found') |
如果同一个例子与
新的样式类是"对象"的子类(直接或间接)。除了
通常,您需要重写
额外信息:http://www.devx.com/opensource/article/31482/0/page/4