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中的lambda表达式的用法
Aug 28 Python
通过5个知识点轻松搞定Python的作用域
Sep 09 Python
python装饰器实例大详解
Oct 25 Python
Pytorch入门之mnist分类实例
Apr 14 Python
python将txt文件读取为字典的示例
Dec 22 Python
使用TensorFlow实现二分类的方法示例
Feb 05 Python
浅谈python中get pass用法
Mar 19 Python
python如何获取列表中每个元素的下标位置
Jul 01 Python
Django中Middleware中的函数详解
Jul 18 Python
浅谈keras保存模型中的save()和save_weights()区别
May 21 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
May 25 Python
python实现一个简单RPC框架的示例
Oct 28 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
hadoop中一些常用的命令介绍
2013/06/19 PHP
php生成PDF格式文件并且加密
2015/06/22 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
2017/03/24 PHP
PHP培训要多少钱
2017/06/06 PHP
php中使用array_filter()函数过滤数组实例讲解
2021/03/03 PHP
javascript实现的基于金山词霸网络翻译的代码
2010/01/15 Javascript
jquery div 居中技巧应用介绍
2012/11/24 Javascript
JavaScript实现网页图片等比例缩放实现代码及调用方式
2013/02/25 Javascript
javascript scrollTop正解使用方法
2013/11/14 Javascript
一些老手都不一定知道的JavaScript技巧
2014/05/06 Javascript
对比分析AngularJS中的$http.post与jQuery.post的区别
2015/02/27 Javascript
Javascript仿新浪游戏频道鼠标悬停显示子菜单效果
2015/08/21 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
2016/05/30 Javascript
bootstrap实现图片自动轮播
2016/12/21 Javascript
JS传参及动态修改页面布局
2017/04/13 Javascript
JS库之Waypoints的用法详解
2017/09/13 Javascript
vue-router重定向不刷新问题的解决
2018/06/25 Javascript
ES6知识点整理之对象解构赋值应用示例
2019/04/17 Javascript
jQuery实现倒计时功能完整示例
2020/06/01 jQuery
Python之PyUnit单元测试实例
2014/10/11 Python
简单的连接MySQL与Python的Bottle框架的方法
2015/04/30 Python
Django框架实现的分页demo示例
2019/05/25 Python
django认证系统实现自定义权限管理的方法
2019/08/28 Python
django重新生成数据库中的某张表方法
2019/08/28 Python
Python列表去重复项的N种方法(实例代码)
2020/05/12 Python
英语道歉信范文
2014/01/09 职场文书
文案策划求职信
2014/03/18 职场文书
2014年计生工作总结
2014/11/21 职场文书
先进班集体事迹材料
2014/12/25 职场文书
先进党组织事迹材料
2014/12/26 职场文书
离婚协议书范文2015
2015/01/26 职场文书
SQL SERVER中常用日期函数的具体使用
2021/04/08 SQL Server
golang elasticsearch Client的使用详解
2021/05/05 Golang
zabbix监控mysql的实例方法
2021/06/02 MySQL
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android