Discuss / Python / 定制类str \ getattr \ call

定制类str \ getattr \ call

Topic source
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'   #怎么得出的这个结果?

1,Chain() 实例化,执行init, path默认为空, str返回空

2,Chain().status ,实例调用属性不存在,执行getattr方法。获取Chain(‘/status’)覆盖Chain,str返回/status

3,Chain().status.user.执行getatter. 获取Chain(‘/status/user’), str返回/status/user’

.....最后str返回/status/user/timeline/list

---------------------------------------------------------------------------

Chain().users('michael').repos  #这种调用方法的结果如何理解?
同理。只不过('michael')调用会找call()方法。结果,过程也是一样的
def __call__(self, path):
     return Chain('%s/%s' % (self._path, path))
def __getattr__(self, path):
     return Chain('%s/%s' % (self._path, path))


  • 1

Reply