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数组条件过滤filter函数使用示例
Jul 22 Python
跟老齐学Python之玩转字符串(1)
Sep 14 Python
详解python 字符串和日期之间转换 StringAndDate
May 04 Python
浅谈pyhton学习中出现的各种问题(新手必看)
May 17 Python
Python中Scrapy爬虫图片处理详解
Nov 29 Python
对Python 数组的切片操作详解
Jul 02 Python
使用Python3内置文档高效学习以及官方中文文档
May 19 Python
python多线程扫描端口(线程池)
Sep 04 Python
Python高阶函数、常用内置函数用法实例分析
Dec 26 Python
python实现Oracle查询分组的方法示例
Apr 30 Python
python 逆向爬虫正确调用 JAR 加密逻辑
Jan 12 Python
OpenCV实现常见的四种图像几何变换
Apr 01 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
PHP编码转换函数 自动转换字符集支持数组转换
2012/12/16 PHP
PHP编程中的Session阻塞问题与解决方法分析
2017/08/07 PHP
Laravel手动返回错误码示例
2019/10/22 PHP
基于jQuery制作迷你背词汇工具
2010/07/27 Javascript
js弹出模式对话框,并接收回传值的方法
2013/03/12 Javascript
jquery ajax属性async(同步异步)示例
2013/11/05 Javascript
JavaScript获取多个数组的交集简单实例
2013/11/11 Javascript
EasyUI实现二级页面的内容勾选的方法
2015/03/01 Javascript
javascript实现网页字符定位的方法
2015/07/14 Javascript
深入理解ECMAScript的几个关键语句
2016/06/01 Javascript
js捕捉键盘事件和按键键值的方法
2016/10/10 Javascript
javascript正则表达式模糊匹配IP地址功能示例
2017/01/06 Javascript
angular2+node.js express打包部署的实战
2017/07/27 Javascript
微信jssdk逻辑在vue中的运用详解
2018/11/14 Javascript
JavaScript实现无限级递归树的示例代码
2019/03/29 Javascript
highcharts.js数据绑定方式代码实例
2019/11/13 Javascript
JS控制只能输入数字并且最多允许小数点两位
2019/11/24 Javascript
vue数据响应式原理知识点总结
2020/02/16 Javascript
Vue3为什么这么快
2020/09/23 Javascript
[47:38]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
详解python3实现的web端json通信协议
2016/12/29 Python
Python实现的简单线性回归算法实例分析
2018/12/26 Python
Python实现简单查找最长子串功能示例
2019/02/26 Python
Python用input输入列表的实例代码
2020/02/07 Python
python词云库wordcloud的使用方法与实例详解
2020/02/17 Python
Django中的session用法详解
2020/03/09 Python
Python-jenkins模块之folder相关操作介绍
2020/05/12 Python
Shopee越南:东南亚与台湾电商平台
2019/02/03 全球购物
SOKOLOV官网:俄罗斯珠宝首饰品牌
2021/01/02 全球购物
妇产科护士自我鉴定
2013/10/15 职场文书
教师找工作推荐信
2013/11/23 职场文书
致跳远运动员加油稿
2014/02/11 职场文书
菜篮子工程实施方案
2014/03/08 职场文书
简单租房协议书
2014/10/21 职场文书
2015年学校办公室工作总结
2015/05/26 职场文书
拒绝盗图!教你怎么用python给图片加水印
2021/06/04 Python