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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值