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中使用platform模块获取系统信息的用法教程
Jul 08 Python
python中的常量和变量代码详解
Jul 25 Python
Python实现八皇后问题示例代码
Dec 09 Python
对python mayavi三维绘图的实现详解
Jan 08 Python
python把转列表为集合的方法
Jun 28 Python
详解python中__name__的意义以及作用
Aug 07 Python
解决Tensorflow sess.run导致的内存溢出问题
Feb 05 Python
Python如何访问字符串中的值
Feb 09 Python
深入浅析Python代码规范性检测
Jul 31 Python
如何利用Python动态模拟太阳系运转
Sep 04 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
Sep 28 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
Nov 01 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
ninety plus是什么?ninety plus咖啡好吗?
2021/03/04 新手入门
PHP+AJAX实现无刷新注册(带用户名实时检测)
2007/01/02 PHP
PHP 正则表达式常用函数
2014/08/17 PHP
CodeIgniter控制器之业务逻辑实例分析
2016/01/20 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
在网页中控制wmplayer播放器
2006/07/01 Javascript
用Javascript实现锚点(Anchor)间平滑跳转
2009/09/08 Javascript
javascript禁用键盘功能键让右击及其他键无效
2013/10/09 Javascript
SyntaxHighlighter 3.0.83使用笔记
2015/01/26 Javascript
JavaScript的jQuery库插件的简要开发指南
2015/08/12 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
2016/06/22 Javascript
python爬取安居客二手房网站数据(实例讲解)
2017/10/19 Javascript
少女风vue组件库的制作全过程
2019/05/15 Javascript
微信小程序mpvue点击按钮获取button值的方法
2019/05/29 Javascript
js常见遍历操作小结
2019/06/06 Javascript
javascript 易错知识点实例小结
2020/04/25 Javascript
Node.js API详解之 util模块用法实例分析
2020/05/09 Javascript
Openlayers+EasyUI Tree动态实现图层控制
2020/09/28 Javascript
详解python实现识别手写MNIST数字集的程序
2018/08/03 Python
python实现指定文件夹下的指定文件移动到指定位置
2018/09/17 Python
python查询文件夹下excel的sheet名代码实例
2019/04/02 Python
python爬取Ajax动态加载网页过程解析
2019/09/05 Python
如何查看Django ORM执行的SQL语句的实现
2020/04/20 Python
使用python-Jenkins批量创建及修改jobs操作
2020/05/12 Python
Tensorflow tensor 数学运算和逻辑运算方式
2020/06/30 Python
图解Python中深浅copy(通俗易懂)
2020/09/03 Python
HTML5中5个简单实用的API
2014/04/28 HTML / CSS
HTML5移动端开发中的Viewport标签及相关CSS用法解析
2016/04/15 HTML / CSS
Lacoste(法国鳄鱼)加拿大官网:以标志性的POLO衫而闻名
2019/05/15 全球购物
美国优质宠物用品购买网站:Muttropolis
2020/02/17 全球购物
说明书怎么写
2014/05/06 职场文书
2015迎新晚会开场白
2015/05/29 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书
一篇合格的广告文案,其主要目的是什么?
2019/07/12 职场文书
Nginx部署vue项目和配置代理的问题解析
2021/08/04 Servers
Python语言内置数据类型
2022/02/24 Python