设为首页 收藏本站
查看: 975|回复: 0

[经验分享] python __setattr__, __getattr__, __delattr__, __call__

[复制链接]

尚未签到

发表于 2015-4-22 11:38:39 | 显示全部楼层 |阅读模式
python __setattr__, __getattr__, __delattr__, __call__

getattr
  `getattr`函数属于内建函数,可以通过函数名称获取



value = obj.attribute
value = getattr(obj, "attribute")
  使用`getattr`来实现工厂模式



#一个模块支持html、text、xml等格式的打印,根据传入的formate参数的不同,调用不同的函数实现几种格式的输出
import statsout
def output(data, format="text"):                           
output_function = getattr(statsout, "output_%s" %format)
return output_function(data)
__call__
  `__call__`方法用于实例自身的调用:



class storage(dict):
# __call__方法用于实例自身的调用
#达到()调用的效果
def __call__ (self, key):
try:
return self[key]
except KeyError, k:
return None
s = storage()
s['key'] = 'value'
print s(key) #调用__call__
__getattr__
  从对象中读取某个属性时,首先需要从self.__dicts__中搜索该属性,再从__getattr__中查找。



class A(object):  
def __init__(self):  
self.name = 'from __dicts__: zdy'  
def __getattr__(self, item):  
if item == 'name':  
return 'from __getattr__: zdy'  
elif item == 'age':  
return 26  
a = A()  
print a.name # 从__dict__里获得的  
print a.age # 从__getattr__获得的  
__setattr__
  `__setattr__`函数是用来设置对象的属性,通过object中的__setattr__函数来设置属性:



class A(object):
def __setattr__(self, *args, **kwargs):  
print 'call func set attr'  
return object.__setattr__(self, *args, **kwargs)
__delattr__
  `__delattr__`函数式用来删除对象的属性:



class A(object):
def __delattr__(self, *args, **kwargs):  
print 'call func del attr'  
return object.__delattr__(self, *args, **kwargs)  
例子
  完整例子可以参考微博API:http://github.liaoxuefeng.com/sinaweibopy/



class _Executable(object):
def __init__(self, client, method, path):
self._client = client
self._method = method
self._path = path
#__call__函数实现_Executable函数对象为可调用的
def __call__(self, **kw):
method = _METHOD_MAP[self._method]
if method==_HTTP_POST and 'pic' in kw:
method = _HTTP_UPLOAD
return _http_call('%s%s.json' % (self._client.api_url, self._path), method, self._client.access_token, **kw)
def __str__(self):
return '_Executable (%s %s)' % (self._method, self._path)
__repr__ = __str__
class _Callable(object):
def __init__(self, client, name):
self._client = client
self._name = name
def __getattr__(self, attr):
if attr=='get':
       #初始化_Executable对象,调用__init__函数
return _Executable(self._client, 'GET', self._name)
if attr=='post':
return _Executable(self._client, 'POST', self._name)
name = '%s/%s' % (self._name, attr)
return _Callable(self._client, name)
def __str__(self):
return '_Callable (%s)' % self._name
__repr__ = __str__
  而在源码中,存在下面代码片段:



class APIClient(object):
'''
API client using synchronized invocation.
'''
...
def __getattr__(self, attr):
if '__' in attr:
return getattr(self.get, attr)
return _Callable(self, attr)
  因此,加入我们初始化对象,并调用某函数如下:



client = APIClient(...)
#会调用__getattr__函数,从而调用__call__函数
client.something.get()
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-59589-1-1.html 上篇帖子: pyxml for python 2.6 死而复生 下篇帖子: [原创]win7环境下搭建eclipse+python+django开发环境
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表