Discuss / Python / 疑问

疑问

Topic source

Waslay__

#1 Created at ... [Delete] [Delete and Lock User]

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__

Chain().status.user.timeline.list '/status/user/timeline/list' 大家好,我想问一下最后的部分 第一个‘/’我能理解,后面的'.'为什么都变成了‘/’呢 第二次调用Chain()的话不是变成了Chain('/status.user.timeline.list')了吗,不就是返回了str的return了吗

ZTX的猫猫

#2 Created at ... [Delete] [Delete and Lock User]

Chain().status.user.timeline.list的调用过程为: Chain().status调用getattr(self, path)方法,返回一个Chain类的实例,该实例的path属性为'/status',然后该实例接着调用_getattr(self, path)方法,此时path为'user',_path为'/status',该方法又返回一个Chain类的实例,_path属性为'/status/user',如此循环,知道语句执行完毕。

其实就是一个递归调用。

#伪代码

Chain().status.user.timeline.list

↓ Chain(path= '').__getattr__(self, path='status')
return Chain('%s/%s' % (self._path='', path= 'status'))=Chain('/status')

↓
Chain('/status').user.timeline.list

↓Chain(path= '/status').__getattr__(self, path='usr')
return Chain('%s/%s' % (self._path='/status', path= 'usr'))=Chain('/status/usr')

…………………………

漂泊醉梦

#5 Created at ... [Delete] [Delete and Lock User]

4楼的清楚多了,还是想问下从Chain('/status')——> Chain('/status').user.timeline.list 是什么原理呢?


  • 1

Reply