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中Django 后台自定义表单控件
Mar 28 Python
python交互式图形编程实例(二)
Nov 17 Python
Python将图片转换为字符画的方法
Jun 16 Python
python使用epoll实现服务端的方法
Oct 16 Python
python 将json数据提取转化为txt的方法
Oct 26 Python
python面向对象实现名片管理系统文件版
Apr 26 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
Jun 14 Python
将python运行结果保存至本地文件中的示例讲解
Jul 11 Python
python实现翻译word表格小程序
Feb 27 Python
如何使用Python处理HDF格式数据及可视化问题
Jun 24 Python
手把手教你配置JupyterLab 环境的实现
Feb 02 Python
python中subplot大小的设置步骤
Jun 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
用PHP制作静态网站的模板框架(三)
2006/10/09 PHP
第七章 php自定义函数实现代码
2011/12/30 PHP
php析构函数的简单使用说明
2015/08/24 PHP
关于laravel 子查询 & join的使用
2019/10/16 PHP
Prototype 学习 Prototype对象
2009/07/12 Javascript
jquery CSS选择器笔记
2010/03/29 Javascript
Javascript 类与静态类的实现
2010/04/01 Javascript
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
基于jquery的合并table相同单元格的插件(精简版)
2011/04/05 Javascript
js实现翻页后保持checkbox选中状态的实现方法
2012/11/03 Javascript
JS保存、读取、换行、转Json报错处理方法
2013/06/14 Javascript
javascript闭包入门示例
2014/04/30 Javascript
Javascript实现禁止输入中文或英文的例子
2014/12/09 Javascript
jquery图片切换实例分析
2015/04/15 Javascript
AngularJS 模块化详解及实例代码
2016/09/14 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
微信小程序实现带刻度尺滑块功能
2017/03/29 Javascript
vue异步加载高德地图的实现
2018/06/19 Javascript
详解Require.js与Sea.js的区别
2018/08/05 Javascript
iview Upload组件多个文件上传的示例代码
2018/09/30 Javascript
你应该了解的JavaScript Array.map()五种用途小结
2018/11/14 Javascript
jQuery事件blur()方法的使用实例讲解
2019/03/30 jQuery
python实现socket端口重定向示例
2014/02/10 Python
详解python string类型 bytes类型 bytearray类型
2017/12/16 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
2018/04/28 Python
Python爬虫抓取技术的一些经验
2019/07/12 Python
python如何调用字典的key
2020/05/25 Python
CSS3实现时间轴效果
2016/07/11 HTML / CSS
仓库管理制度
2014/01/21 职场文书
小学防溺水制度
2014/01/29 职场文书
食品业务员岗位职责
2014/03/18 职场文书
2014春晚主持词
2014/03/25 职场文书
检察机关个人对照检查材料
2014/09/15 职场文书
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
2021/04/27 Python
Vue + iView实现Excel上传功能的完整代码
2021/06/22 Vue.js
Python必备技巧之字符数据操作详解
2022/03/23 Python