Python.__getattr__Vs__getattribute__

__getattr__ Vs __getattribute__

 1 class Fish(object):
 2     
 3     def __getattr__(self, key):
 4         if key == 'color':
 5             print 'access color'
 6             return 'blue'
 7         else: 
 8             raise AttributeError
 9         
10     def __getattribute__(self, key):
11         print '__getattribute__ %s' %key
12         return object.__getattribute__(self, key)
13         
14 
15 if __name__ == "__main__":
16     f = Fish()
17     
18     print "First %s \n" %f.color
19     
20     print '-----------------------\n'
21     
22     print "Second %s" %f.color

以上代码的输出如下:

__getattribute__ color

access color

First blue 

 

-----------------------

 

__getattribute__ color

access color

Second blue

http://docs.python.org/2/reference/datamodel.html

3.4.2. Customizing attribute access

object.__getattr__(selfname)

Called when an attribute lookup has not found the attribute in the usual places (i.e. it is not an instance attribute nor is it found in the class tree for self). name is the attribute name. This method should return the (computed) attribute value or raise anAttributeError exception.

Note that if the attribute is found through the normal mechanism, __getattr__() is not called. (This is an intentional asymmetry between __getattr__() and __setattr__().) This is done both for efficiency reasons and because otherwise __getattr__() would have no way to access other attributes of the instance. Note that at least for instance variables, you can fake total control by not inserting any values in the instance attribute dictionary (but instead inserting them in another object). See the __getattribute__()method below for a way to actually get total control in new-style classes.

3.4.2.1. More attribute access for new-style classes

The following methods only apply to new-style classes.

object. __getattribute__ ( selfname )

Called unconditionally to implement attribute accesses for instances of the class. If the class also defines __getattr__(), the latter will not be called unless __getattribute__() either calls it explicitly or raises an AttributeError. This method should return the (computed) attribute value or raise an AttributeError exception. In order to avoid infinite recursion in this method, its implementation should always call the base class method with the same name to access any attributes it needs, for example,object.__getattribute__(self, name).

Note

This method may still be bypassed when looking up special methods as the result of implicit invocation via language syntax or built-in functions. See Special method lookup for new-style classes.

 

 

转载于:https://www.cnblogs.com/cwgk/p/3375260.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值