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实现telnet客户端的方法
Apr 15 Python
Python写入数据到MP3文件中的方法
Jul 10 Python
python递归打印某个目录的内容(实例讲解)
Aug 30 Python
Python批处理删除和重命名文件夹的实例
Jul 11 Python
python中metaclass原理与用法详解
Jun 25 Python
对Python3中列表乘以某一个数的示例详解
Jul 20 Python
Python产生一个数值范围内的不重复的随机数的实现方法
Aug 21 Python
python实现在一个画布上画多个子图
Jan 19 Python
Python字典添加,删除,查询等相关操作方法详解
Feb 07 Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
Mar 10 Python
基于nexus3配置Python仓库过程详解
Jun 15 Python
python调用win32接口进行截图的示例
Nov 11 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.ini安全配置检测工具pcc简单介绍
2015/07/02 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
PHP实现字符串大小写转函数的功能实例
2019/02/06 PHP
让您的菜单不离网站
2006/10/03 Javascript
IE8 中使用加速器(Activities)
2010/05/14 Javascript
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
jquery 实现上下滚动效果示例代码
2013/08/09 Javascript
jquery判断浏览器后退时候弹出消息的方法
2014/08/11 Javascript
JavaScript异步加载浅析
2014/12/28 Javascript
jQuery关键词说明插件cluetip使用指南
2015/04/21 Javascript
jQuery 遍历函数详解
2015/07/05 Javascript
详解js中class的多种函数封装方法
2016/01/03 Javascript
关于预加载InstantClick的问题解决方法
2017/09/12 Javascript
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
2017/11/06 Javascript
js+canvas实现滑动拼图验证码功能
2018/03/26 Javascript
Vue 2.0 侦听器 watch属性代码详解
2019/06/19 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
[38:30]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场2
2014/05/24 DOTA
跟老齐学Python之有容乃大的list(3)
2014/09/15 Python
python3实现UDP协议的服务器和客户端
2017/06/14 Python
分析Python读取文件时的路径问题
2018/02/11 Python
Python中str.join()简单用法示例
2018/03/20 Python
Pycharm取消py脚本中SQL识别的方法
2018/11/29 Python
python的pytest框架之命令行参数详解(下)
2019/06/27 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
2020/05/20 Python
python3.6使用SMTP协议发送邮件
2020/05/20 Python
Python字符串及文本模式方法详解
2020/09/10 Python
CSS3为背景图设置遮罩并解决遮罩样式继承问题
2020/06/22 HTML / CSS
户籍证明的格式
2014/01/13 职场文书
导师评语大全
2014/04/26 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/10/28 职场文书
关于拾金不昧的感谢信
2015/01/21 职场文书
公司档案管理制度
2015/08/05 职场文书
微信小程序用户授权最佳实践指南
2021/05/08 Javascript
HTML+CSS制作心跳特效的实现
2021/05/26 HTML / CSS
NoSQL优缺点与MongoDB数据库简介
2022/06/05 MongoDB