python __setattr__, __getattr__, __delattr__, __call__

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

 


本文 由 cococo点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012

时间: 2024-11-03 04:13:20

python __setattr__, __getattr__, __delattr__, __call__的相关文章

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

getattr `getattr`函数属于内建函数,可以通过函数名称获取 复制代码 代码如下: value = obj.attribute value = getattr(obj, "attribute") 使用`getattr`来实现工厂模式 复制代码 代码如下: #一个模块支持html.text.xml等格式的打印,根据传入的formate参数的不同,调用不同的函数实现几种格式的输出 import statsout def output(data, format="tex

python中__getattr__与__getattribute__用法

定义区别: __getattr__(self, item) 获取实例的属性时,仅当实例属性中不包括item时,才被调用.这个方法应该返回相应的属性值或者抛出 AttributeError 异常 __getattribute__(self, item) 获取实例属性时,无条件调用该方法,不论实例属性中是否包括item 应用实例 1. 利用 __getattr__结合递归实现url动态生成器,代码来自于github-sinaweibopy class UrlGenerator(object):   

Python魔术方法详解_python

介绍 此教程为我的数篇文章中的一个重点.主题是魔术方法. 什么是魔术方法?他们是面向对象的Python的一切.他们是可以给你的类增加"magic"的特殊方法.他们总是被双下划线所包围(e.g. __init__ 或者 __lt__).然而他们的文档却远没有提供应该有的内容.Python中所有的魔术方法均在Python官方文档中有相应描述,但是对于他们的描述比较混乱而且组织比较松散.很难找到有一个例子(也许他们原本打算的很好,在开始语言参考中有描述很详细,然而随之而来的确是枯燥的语法描述

可爱的Python:Python之优雅与瑕疵,第2部分

本系列 第一期文章 讨论了序列和比较.本期文章将以这些主题为基础展开讨论. 在大多数面向对象语言中,方法和属性几乎相同(但并非完全相同).两者都可以附加到类和/或实例.除了实现细节外,存在一个关键区别:当附加到对象时,您可以调用 方法 发起动作和计算:而属性 仅具有一些可被检索(或者修改)的值. 对于某些语言(例如 Java 语言),这可能是惟一的区别.属性和方法之间泾渭分明.Java 语言通常主要关注封装和数据隐藏:因此鼓励使用 "setters" 和 "getters&q

python中类的全面分析

面向对象重要的概念就是类(Class)和实例(Instance),类是抽象的模板,而实例是根据类创建出来的一个个具体的"对象",每个对象都拥有相同的方法,但各自的数据可能不同. 先回顾下 OOP 的常用术语: 类:对具有相同数据和方法的一组对象的描述或定义. 对象:对象是一个类的实例. 实例(instance):一个对象的实例化实现. 实例属性(instance attribute):一个对象就是一组属性的集合. 实例方法(instance method):所有存取或者更新对象某个实例

Python 的 Magic Methods 指南

介绍 本指南是数月博客的总结.主题是魔术方法. 什么是魔术方法呢?它们是面向对象Python语言中的一切.它们是你可以自定义并添加"魔法"到类中的特殊方法.它们被双下划线环绕(比如__init__或__lt__).它们的文档也不像它所需要的那么齐备.Python的所有魔术方法都在Python文档的同一区域,但它们的使用分散,组织松散.而且文档的这部分区域中几乎没有一个示例(这很有可能是设计好的,因为在语法参考里它们都很详尽,但伴随的是枯燥的语法描述等等). 因此,为了解决Python文

python黑魔法之 --- 参数传递

我们都听说,python世界里面,万物皆对象. 怎么说万物皆对象呢?最常见的: > class A: pass > a = A() 我们说a是一个对象. 那么既然是万物了,其实A也是对象.3 也是对象.True 也是对象."hello" 也是对象. > def Func(): pass o~yee, Func 也是对象. 那么对象之间的传递是如何呢?我们看看下面两个简单的例子: > a = 3 > b = a > b = 3 + 1 > pri

深入理解Python中的ThreadLocal变量(中)

在 深入理解Python中的ThreadLocal变量(上)中我们看到 ThreadLocal 的引入,使得可以很方便地在多线程环境中使用局部变量.如此美妙的功能到底是怎样实现的?如果你对它的实现原理没有好奇心或一探究竟的冲动,那么接下来的内容估计会让你后悔自己的浅尝辄止了. 简单来说,Python 中 ThreadLocal 就是通过下图中的方法,将全局变量伪装成线程局部变量,相信读完本篇文章你会理解图中内容的.(对这张图不眼熟的话,可以回顾下上篇)). 在哪里找到源码? 好了,终于要来分析

Python中有趣在

  这篇文章主要介绍了Python中有趣在__call__函数,本文直接给出一个使用实例,以此来讲解__call__函数的用法,需要的朋友可以参考下 Python中有一个有趣的语法,只要定义类型的时候,实现__call__函数,这个类型就成为可调用的. 换句话说,我们可以把这个类型的对象当作函数来使用,相当于 重载了括号运算符. ? 1 2 3 4 5 class g_dpm(object): def __init__(self, g): self.g = g def __call__(self