__getattr__()方法实现任意调用(链式调用是特殊情况)

Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 07:18:10) [MSC v.1900 32 bit (Intel)] on win32
Type “copyright”, “credits” or “license()” for more information.

#getattr()方法,动态返回一个属性
#!!注意,只有在没有找到属性的情况下,才调用__getattr__,已有的属性,比如 name,不会在__getattr__中查找。
#注意到任意调用,如 s.abc 都会返回 None
#利用完全动态的__getattr__,我们可以写出一个链式调用
class Chain(object):
def init(self, path=’’):
self._path = path
print (path)
def getattr(self, path):
return Chain(’%s/%s’ % (self._path, path))#调用自身初始化
def str(self):
return self._path
repr = str#为了创建实例就能返回结果而不是返回方法特性

#创建实例
s=Chain()

class Chain(object):
def init(self, path=’’):
self._path = path

def __getattr__(self, path):
	return Chain('%s/%s' % (self._path, path))#调用自身初始化
def __str__(self):
	return self._path
__repr__ = __str__#为了创建实例就能返回结果而不是返回方法特性

s=Chain()
s.scor
/scor

#任意调用
s.a
/a

class Chain(object):
def init(self, path=’’):
self._path = path
print (“self._path:”,path)

def __getattr__(self, path):
	return Chain('%s/%s' % (self._path, path))#调用自身初始化
def __str__(self):
	return self._path
__repr__ = __str__#为了创建实例就能返回结果而不是返回方法特性

s=Chain()
self._path:

s.status
self._path: /status
/status

#status是当做一个特征参数传入到函数__getattr__(self, path)体就是path=status
#层层的调用Chain自己迭代,self._path保存了迭代值
s…status.user.timeline.list
SyntaxError: invalid syntax

s.status.user.timeline.list
self._path: /status
self._path: /status/user
self._path: /status/user/timeline
self._path: /status/user/timeline/list
/status/user/timeline/list

#层层的调用Chain自己迭代,进行不断的初始化,self._path保存了迭代值

#__getattr__动态增加了一个status属性,对实例进行调用时可以带参数
class Chain(object):
def init(self, path=’’):
self._path = path
print (“self._path:”,path)

def __getattr__(self, path):
	return Chain('%s/%s' % (self._path, path))#调用自身初始化
def __str__(self):
	return self._path
def __call__(self,s):
	return Chain('%s:%s'%(self._path,s))

print (Chain().status.user(‘micheal’).timeline.list)
self._path:
self._path: /status
self._path: /status/user
self._path: /status/user:micheal
self._path: /status/user:micheal/timeline
self._path: /status/user:micheal/timeline/list
/status/user:micheal/timeline/list

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值