Python __setattr__、 __getattr__、 __delattr__、__call__用法示例

 更新时间:2015年03月06日 09:32:50   投稿:junjie  
这篇文章主要介绍了Python __setattr__、 __getattr__、 __delattr__、__call__用法示例,本文分别对这几个魔法方法做了讲解,需要的朋友可以参考下

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()

相关文章

  • 创建pycharm的自定义python模板方法

    创建pycharm的自定义python模板方法

    今天小编就为大家分享一篇创建pycharm的自定义python模板方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Python数据可视化之Seaborn的使用详解

    Python数据可视化之Seaborn的使用详解

    Seaborn库是python中基于matplotlib库的可视化工具库,通过sns我们可以更方便地绘制出更美观的图表。本文将分享python基于Seaborn库的一系列绘图操作,感兴趣的可以了解一下
    2022-04-04
  • Python实现按学生年龄排序的实际问题详解

    Python实现按学生年龄排序的实际问题详解

    这篇文章主要给大家介绍了关于Python实现按学生年龄排序实际问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-08-08
  • Python绘制的二项分布概率图示例

    Python绘制的二项分布概率图示例

    这篇文章主要介绍了Python绘制的二项分布概率图,涉及Python基于numpy、math的数值运算及matplotlib图形绘制相关操作技巧,需要的朋友可以参考下
    2018-08-08
  • 浅谈django model postgres的json字段编码问题

    浅谈django model postgres的json字段编码问题

    下面小编就为大家分享一篇浅谈django model postgres的json字段编码问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • 详解python文件的操作和异常的处理

    详解python文件的操作和异常的处理

    这篇文章主要为大家介绍了python文件的操作和异常的处理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • Python进程Multiprocessing模块原理解析

    Python进程Multiprocessing模块原理解析

    这篇文章主要介绍了Python进程Multiprocessing模块原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Python Sql数据库增删改查操作简单封装

    Python Sql数据库增删改查操作简单封装

    这篇文章主要为大家介绍了Python Sql数据库增删改查操作简单封装,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • Python+matplotlib绘制饼图和堆叠图

    Python+matplotlib绘制饼图和堆叠图

    Matplotlib是Python的绘图库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。本文将为大家介绍如何用matplotlib绘制饼图和堆叠图,感兴趣的朋友可以学习一下
    2022-04-04
  • Python中的NumPy实用函数整理之percentile详解

    Python中的NumPy实用函数整理之percentile详解

    这篇文章主要介绍了Python中的NumPy实用函数整理之percentile详解,NumPy函数percentile()用于计算指定维度上数组元素的第 n 个百分位数,返回值为标量或者数组,需要的朋友可以参考下
    2023-09-09

最新评论