python __setattr__, __getattr__, __delattr__, __call__

11615 ワード

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