python __setattr__, __getattr__, __delattr__, __call__
11615 ワード
python __setattr__, __getattr__, __delattr__, __call__
getattr
`getattr`関数は組み込み関数に属し、関数名で取得できます
`getattr`を使用して工場モードを実現
__call__
`__call__`メソッドは、インスタンス自体の呼び出しに使用されます.
__getattr__
オブジェクトからプロパティを読み込む場合は、まずself._dicts__を選択します.getattr__に表示されます.
__setattr__
`__setattr__`関数はオブジェクトのプロパティを設定するために使用され、objectの__を通過します.setattr__関数を使用して、属性を設定します.
__delattr__
`__delattr__`関数式は、オブジェクトのプロパティを削除するために使用します.
例
完全な例は、マイクロブログAPIを参照してください.http://github.liaoxuefeng.com/sinaweibopy/
ソースコードには、次のコードクリップがあります.
したがって、オブジェクトを初期化し、次のように関数を呼び出します.
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()