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 相关文章推荐
举例讲解Django中数据模型访问外键值的方法
Jul 21 Python
python字符串的常用操作方法小结
May 21 Python
详解如何将python3.6软件的py文件打包成exe程序
Oct 09 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
Dec 05 Python
Python http接口自动化测试框架实现方法示例
Dec 06 Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
Aug 07 Python
python多线程与多进程及其区别详解
Aug 08 Python
Python socket非阻塞模块应用示例
Sep 12 Python
18个Python脚本可加速你的编码速度(提示和技巧)
Oct 17 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
Oct 24 Python
利用python实现逐步回归
Feb 24 Python
python中怎么表示空值
Jun 19 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正则表达式使用的详细介绍
2013/04/27 PHP
php获取一个变量的名字的方法
2014/09/05 PHP
tp5.1 框架查询表达式用法详解
2020/05/25 PHP
jquery 插件之仿“卓越亚马逊”首页弹出菜单效果
2008/12/25 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
2013/12/05 Javascript
javascript运行机制之this详细介绍
2014/02/07 Javascript
jquery中的$(document).ready()使用小结
2014/02/14 Javascript
nodeJS代码实现计算交社保是否合适
2015/03/09 NodeJs
jquery实现表单输入时提示文字滑动向上效果
2015/08/10 Javascript
微信+angularJS的SPA应用中用router进行页面跳转,jssdk校验失败问题解决
2016/09/09 Javascript
JavaScript数据结构之二叉查找树的定义与表示方法
2017/04/12 Javascript
详解如何使用vue-cli脚手架搭建Vue.js项目
2017/05/19 Javascript
Vue中的v-for循环key属性注意事项小结
2018/08/12 Javascript
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
2019/02/27 jQuery
一文读懂ES7中的javascript修饰器
2019/05/06 Javascript
解决vuex数据异步造成初始化的时候没值报错问题
2019/11/13 Javascript
[01:04:06]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第一局
2016/02/26 DOTA
python里将list中元素依次向前移动一位
2014/09/12 Python
python版本的读写锁操作方法
2016/04/25 Python
python实现监控某个服务 服务崩溃即发送邮件报告
2018/06/21 Python
django 自定义filter 判断if var in list的例子
2019/08/20 Python
Window10下python3.7 安装与卸载教程图解
2019/09/30 Python
通过celery异步处理一个查询任务的完整代码
2019/11/19 Python
Python实现新型冠状病毒传播模型及预测代码实例
2020/02/05 Python
python matplotlib实现将图例放在图外
2020/04/17 Python
Python改变对象的字符串显示的方法
2020/08/01 Python
python 实现控制鼠标键盘
2020/11/27 Python
美国在线健康和美容市场:Pharmapacks
2018/12/05 全球购物
手工制作的意大利皮革运动鞋:KOIO
2020/01/05 全球购物
空指针到底是什么
2012/08/07 面试题
中专生求职自荐信范文
2013/12/22 职场文书
简历里的自我评价
2014/01/31 职场文书
2015年高校保卫处工作总结
2015/07/23 职场文书
导游词之青岛太清宫
2019/12/13 职场文书
Elasticsearch 基本查询和组合查询
2022/04/19 Python