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调用C语言开发的共享库方法实例
Mar 18 Python
python开发之函数定义实例分析
Nov 12 Python
Python基于正则表达式实现检查文件内容的方法【文件检索】
Aug 30 Python
python十进制和二进制的转换方法(含浮点数)
Jul 07 Python
Python使用googletrans报错的解决方法
Sep 25 Python
使用python和pygame制作挡板弹球游戏
Dec 03 Python
python实现从尾到头打印单链表操作示例
Feb 22 Python
浅谈Python中os模块及shutil模块的常规操作
Apr 03 Python
Python Http请求json解析库用法解析
Nov 28 Python
Python+unittest+DDT实现数据驱动测试
Nov 30 Python
Python标准库之typing的用法(类型标注)
Jun 02 Python
Python编程super应用场景及示例解析
Oct 05 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
DC的38部超级英雄动画电影
2020/03/03 欧美动漫
PHP 循环列出目录内容的函数代码
2010/05/26 PHP
php中的boolean(布尔)类型详解
2013/10/28 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
2017/06/15 PHP
基于jquery的动态创建表格的插件
2011/04/05 Javascript
CodeMirror2 IE7/IE8 下面未知运行时错误的解决方法
2012/03/29 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战二)
2013/08/21 Javascript
微信小程序 WebSocket详解及应用
2017/01/21 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
vue组件数据传递、父子组件数据获取,slot,router路由功能示例
2019/03/19 Javascript
详解vue beforeRouteEnter 异步获取数据给实例问题
2019/08/09 Javascript
JavaScript实现栈结构Stack过程详解
2020/03/07 Javascript
javascript实现滚动条效果
2020/03/24 Javascript
Django admin美化插件suit使用示例
2017/12/12 Python
python实现Windows电脑定时关机
2018/06/20 Python
Python基于SMTP协议实现发送邮件功能详解
2018/08/14 Python
Python反射和内置方法重写操作详解
2018/08/27 Python
python+ffmpeg批量去视频开头的方法
2019/01/09 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
2019/07/23 Python
解决Django Static内容不能加载显示的问题
2019/07/28 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
python实现车牌识别的示例代码
2019/08/05 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
python selenium爬取斗鱼所有直播房间信息过程详解
2019/08/09 Python
Python实现网页截图(PyQT5)过程解析
2019/08/12 Python
Python Print实现在输出中插入变量的例子
2019/12/25 Python
不到20行实现Python代码即可制作精美证件照
2020/04/24 Python
Python中过滤字符串列表的方法
2020/12/22 Python
详解CSS3中nth-child与nth-of-type的区别
2017/01/05 HTML / CSS
加拿大女包品牌:Matt & Nat
2017/05/12 全球购物
澳大利亚自然和有机的健康美容产品一站式商店:Ziani Beauty
2017/12/28 全球购物
安全承诺书格式
2014/05/21 职场文书
罚款通知怎么写
2015/04/22 职场文书
2016小学新学期寄语
2015/12/04 职场文书
Jsonp劫持学习
2021/04/01 PHP
Python可视化神器pyecharts绘制地理图表
2022/07/07 Python