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根据距离和时长计算配速示例
Feb 16 Python
Python实现的tcp端口检测操作示例
Jul 24 Python
python 两个数据库postgresql对比
Oct 21 Python
django实现web接口 python3模拟Post请求方式
Nov 19 Python
Python 静态方法和类方法实例分析
Nov 21 Python
python线程定时器Timer实现原理解析
Nov 30 Python
Python+appium框架原生代码实现App自动化测试详解
Mar 06 Python
在Python中用GDAL实现矢量对栅格的切割实例
Mar 11 Python
MAC平台基于Python Appium环境搭建过程图解
Aug 13 Python
python实现ping命令小程序
Dec 28 Python
python3实现无权最短路径的方法
May 12 Python
Python数据可视化之基于pyecharts实现的地理图表的绘制
Jun 10 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提取中文首字母
2008/04/09 PHP
frename PHP 灵活文件命名函数 frename
2009/09/09 PHP
PHP教程 变量定义
2009/10/23 PHP
PHP伪静态Rewrite设置之APACHE篇
2014/07/30 PHP
浅析php如何实现爬取数据原理
2018/09/27 PHP
php图像生成函数之间的区别分析
2012/12/06 Javascript
js操作iframe兼容各种主流浏览器示例代码
2013/07/22 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
2014/05/29 Javascript
JavaScript中使用自然对数ln的方法
2015/06/14 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
jquery文字填写自动高度的实现方法
2016/11/07 Javascript
如何解决hover在ie6中的兼容性问题
2016/12/15 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
js实现自动图片轮播代码
2017/03/22 Javascript
移动端刮刮乐的实现方式(js+HTML5)
2017/03/23 Javascript
基于Vue实现页面切换左右滑动效果
2020/06/29 Javascript
JavaScript如何获取到导航条中HTTP信息
2017/10/10 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
2018/03/22 Javascript
微信小程序实现点击空白隐藏的方法示例
2019/08/13 Javascript
Python内置的字符串处理函数整理
2013/01/29 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
2016/05/16 Python
Python 编码Basic Auth使用方法简单实例
2017/05/25 Python
python入门前的第一课 python怎样入门
2018/03/06 Python
解决Tensorflow使用pip安装后没有model目录的问题
2018/06/13 Python
python实现微信定时每天和女友发送消息
2019/04/29 Python
Python xpath表达式如何实现数据处理
2020/06/13 Python
python实现逻辑回归的示例
2020/10/09 Python
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
销售行业个人求职自荐信
2013/09/25 职场文书
幼儿师范毕业生自荐信
2013/11/09 职场文书
档案接收函范文
2014/01/10 职场文书
广告学专业自荐信范文
2014/02/24 职场文书
纪律教育学习月活动总结
2014/08/27 职场文书
2014年销售部工作总结
2014/12/01 职场文书
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js