Python __setattr__、 __getattr__、 __delattr__、__call__用法示例


Posted in Python onMarch 06, 2015

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()
Python 相关文章推荐
详解Python实现按任意键继续/退出的功能
Aug 19 Python
python好玩的项目—色情图片识别代码分享
Nov 07 Python
python2.x实现人民币转大写人民币
Jun 20 Python
python 使用值来排序一个字典的方法
Nov 16 Python
python使用knn实现特征向量分类
Dec 26 Python
python中break、continue 、exit() 、pass终止循环的区别详解
Jul 08 Python
对Django 转发和重定向的实例详解
Aug 06 Python
如何基于python测量代码运行时间
Dec 25 Python
python+tifffile之tiff文件读写方式
Jan 13 Python
PyTorch中Tensor的数据统计示例
Feb 17 Python
Python接口测试get请求过程详解
Feb 28 Python
基于python定位棋子位置及识别棋子颜色
Jul 26 Python
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
Mar 05 #Python
Python挑选文件夹里宽大于300图片的方法
Mar 05 #Python
python基于windows平台锁定键盘输入的方法
Mar 05 #Python
Python格式化压缩后的JS文件的方法
Mar 05 #Python
Python随机生成彩票号码的方法
Mar 05 #Python
Windows下安装python2.7及科学计算套装
Mar 05 #Python
Python可跨平台实现获取按键的方法
Mar 05 #Python
You might like
初探PHP5
2006/10/09 PHP
PHP+jQuery 注册模块开发详解
2014/10/14 PHP
Windows7下的php环境配置教程
2015/02/28 PHP
Yii隐藏URL中index.php的方法
2016/07/12 PHP
JTrackBar水平拖动效果
2007/07/15 Javascript
jquery 实现上下滚动效果示例代码
2013/08/09 Javascript
获取数组中最大最小值方法js代码(自写)
2013/08/12 Javascript
jQuery的attr与prop使用介绍
2013/10/10 Javascript
使用AngularJS中的SCE来防止XSS攻击的方法
2015/06/18 Javascript
分享Javascript实用方法二
2015/12/13 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
2016/05/24 Javascript
JavaScript蒙板(model)功能的简单实现代码
2016/08/04 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
2017/01/11 Javascript
Javascript实现页面滚动时导航智能定位
2017/05/06 Javascript
angular中实现li或者某个元素点击变色的两种方法
2017/07/27 Javascript
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
微信小程序自定义toast弹窗效果的实现代码
2018/11/15 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
vue实现输入框的模糊查询的示例代码(节流函数的应用场景)
2019/09/01 Javascript
js实现橱窗展示效果
2020/01/11 Javascript
原生JS实现相邻月份日历
2020/10/13 Javascript
对于Python中RawString的理解介绍
2016/07/07 Python
在cmd命令行里进入和退出Python程序的方法
2018/05/12 Python
PyQt5实现五子棋游戏(人机对弈)
2020/03/24 Python
Python安装Flask环境及简单应用示例
2019/05/03 Python
解决c++调用python中文乱码问题
2020/07/29 Python
纯CSS3打造属于自己的“小黄人”
2016/03/14 HTML / CSS
俄罗斯品牌服装和鞋子的在线商店:KUPIVIP
2019/10/27 全球购物
国家助学金获奖感言
2014/01/31 职场文书
药剂专业个人求职信范文
2014/04/29 职场文书
经理任命书模板
2014/06/06 职场文书
电气工程及其自动化专业求职信
2014/06/23 职场文书
亲子运动会的活动方案
2014/08/17 职场文书
股指期货心得体会
2014/09/13 职场文书
群众路线四风问题整改措施
2014/09/27 职场文书
六年级小学生评语
2014/12/26 职场文书