当没有属性时被触发,hession-py使用__getattr__来发送命令。
class Obj(object): photo = "hello" def __getattr__(self, name): print name return _Method(self.__invoke, name) def __invoke(self, method, params): print 'invoke' class _Method: def __init__(self, invoker, method): self._invoker = invoker self._method = method def __call__(self, *args): return self._invoker(self._method, args) o = Obj() o.hello o.hello()
但如果属性存在就不会触发此方法,比如o.photo。这时候可以通过__getattribute__来实现:
class Obj(object): photo = "hello" def __getattribute__(self, name): print '1'+name #return _Method(self.__invoke, name) return object.__getattribute__(self, name) def __invoke(self, method, params): print 'invoke' class _Method: def __init__(self, invoker, method): self._invoker = invoker self._method = method def __call__(self, *args): return self._invoker(self._method, args) o = Obj() o.photo
全部代码:
class Obj(object): photo = "hello" def __getattribute__(self, name): print '1'+name #return _Method(self.__invoke, name) return object.__getattribute__(self, name) def __getattr__(self, name): print '2'+name return _Method(self.__invoke, name) def __invoke(self, method, params): print 'invoke' class _Method: def __init__(self, invoker, method): self._invoker = invoker self._method = method def __call__(self, *args): return self._invoker(self._method, args) o = Obj() print o.photo
参考:
http://docs.python.org/reference/datamodel.html
http://stackoverflow.com/questions/371753/python-using-getattribute-method
http://stackoverflow.com/questions/3278077/difference-between-getattr-vs-getattribute-in-python