python 的getattribute和getattr方法

__getattr__
当没有属性时被触发,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

猜你喜欢

转载自san-yun.iteye.com/blog/1676966