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中针对函数处理的特殊方法
Mar 06 Python
Python-基础-入门 简介
Aug 09 Python
对numpy中array和asarray的区别详解
Apr 17 Python
python实现音乐下载的统计
Jun 20 Python
深入浅析python 协程与go协程的区别
May 09 Python
对django views中 request, response的常用操作详解
Jul 17 Python
详解如何用TensorFlow训练和识别/分类自定义图片
Aug 05 Python
详解Python self 参数
Aug 30 Python
python检查目录文件权限并修改目录文件权限的操作
Mar 11 Python
基于tensorflow __init__、build 和call的使用小结
Feb 26 Python
教你怎么用python爬取爱奇艺热门电影
May 20 Python
Pytorch中expand()的使用(扩展某个维度)
Jul 15 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
基于mysql的论坛(2)
2006/10/09 PHP
php类
2006/11/27 PHP
发布一个用PHP fsockopen写的HTTP下载的类
2007/02/22 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
2014/04/01 PHP
jQuery实现长文字部分显示代码
2013/05/13 Javascript
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
2015/02/03 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
javascript入门之string对象【新手必看】
2016/11/22 Javascript
jQuery实现页面倒计时并刷新效果
2017/03/13 Javascript
JS触摸事件、手势事件详解
2017/05/04 Javascript
JS中offset和匀速动画详解
2018/02/06 Javascript
在vue项目中引入highcharts图表的方法(详解)
2018/03/05 Javascript
es6中reduce的基本使用方法
2019/09/10 Javascript
Vue项目中数据的深度监听或对象属性的监听实例
2020/07/17 Javascript
[05:41]2014DOTA2西雅图国际邀请赛 小组赛7月10日TOPPLAY
2014/07/10 DOTA
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
Python写的服务监控程序实例
2015/01/31 Python
python实现下载文件的三种方法
2017/02/09 Python
python opencv minAreaRect 生成最小外接矩形的方法
2019/07/01 Python
Python 运行.py文件和交互式运行代码的区别详解
2019/07/02 Python
利用Python小工具实现3秒钟将视频转换为音频
2019/10/29 Python
Django通用类视图实现忘记密码重置密码功能示例
2019/12/17 Python
基于keras 模型、结构、权重保存的实现
2020/01/24 Python
Python创建空列表的字典2种方法详解
2020/02/13 Python
python用tkinter实现一个gui的翻译工具
2020/10/26 Python
call在Python中改进数列的实例讲解
2020/12/09 Python
python opencv肤色检测的实现示例
2020/12/21 Python
美国便宜的横幅和标志印刷在线:Best of Signs
2019/05/29 全球购物
华硕新加坡官方网上商店:ASUS Singapore
2020/07/09 全球购物
英语专业学子个人的自我评价
2013/10/02 职场文书
服务行业个人求职的自我评价
2013/12/12 职场文书
船舶专业个人求职信范文
2014/01/02 职场文书
委托书格式
2014/08/01 职场文书
企业党建工作汇报材料
2014/08/19 职场文书
关于战胜挫折的名言警句大全!
2019/07/05 职场文书