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


相关文章
|
8月前
|
Python
Python内置函数--getattr&setattr&delattr&hasattr
Python内置函数--getattr&setattr&delattr&hasattr
33 0
|
9月前
|
存储 Shell Python
Python中os.system()、subprocess.run()、call()、check_output()的用法
Python中os.system()、subprocess.run()、call()、check_output()的用法
183 0
|
Python
python 中__init__ ,__new__ ,__call__,__del__ 方法
python 中__init__ ,__new__ ,__call__,__del__ 方法
131 0
|
11月前
|
Python
Python编程中类的属性获取、设置、判断是否存在等,实战hasattr和getattr函数的应用案例!
Python编程中类的属性获取、设置、判断是否存在等,实战hasattr和getattr函数的应用案例!
141 0
|
12月前
|
设计模式 Java Python
简述Python类中的 __init__、__new__、__call__ 方法
简述Python类中的 __init__、__new__、__call__ 方法
81 0
|
Python
Python编程:getattribute和getattr访问对象属性顺序
Python编程:getattribute和getattr访问对象属性顺序
110 0
|
测试技术 Python
Python - 面向对象编程 - 反射 hasattr、getattr、setattr、delattr (下)
Python - 面向对象编程 - 反射 hasattr、getattr、setattr、delattr (下)
138 0
Python - 面向对象编程 - 反射 hasattr、getattr、setattr、delattr (下)
|
Python
Python - 面向对象编程 - 反射 hasattr、getattr、setattr、delattr (上)
Python - 面向对象编程 - 反射 hasattr、getattr、setattr、delattr (上)
109 0
|
Python
Python - 面向对象编程 - __call__()
Python - 面向对象编程 - __call__()
79 0
Python----魔法函数__getattr__/__setattr__/__delattr__/__getattribute__的用法
Python----魔法函数__getattr__/__setattr__/__delattr__/__getattribute__的用法
115 0