发现python在Chain().users('michael').repos这段代码时,python解释器首先运行Chain.user返回一个Chain()对象,假设为s,再解释运行s('michael'),这相当于对对一个实例对象进行调用,也就是教程中说的可以把对象看作一个函数,故要实现__call__()方法。我觉得这样更符合动态调用的写法,如果下次调用的时候用Chain().name('Bob').repos,不然又要对name进行判断改写代码:
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
def __call__(self,path=''):
return Chain('%s/%s' %(self._path,path))
__repr__ = __str__
Sign in to make a reply
这样的话17422
发现python在Chain().users('michael').repos这段代码时,python解释器首先运行Chain.user返回一个Chain()对象,假设为s,再解释运行s('michael'),这相当于对对一个实例对象进行调用,也就是教程中说的可以把对象看作一个函数,故要实现__call__()方法。我觉得这样更符合动态调用的写法,如果下次调用的时候用Chain().name('Bob').repos,不然又要对name进行判断改写代码:
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
def __call__(self,path=''):
return Chain('%s/%s' %(self._path,path))
__repr__ = __str__