i tried understand following code.
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__ def __call__(self, path): return chain('%s/%s' % (self._path, path)) print (chain().abc.efg("string").repos) the output is:
/abc/efg/string/repos what don't understand why __call__ method not called in chain(/abc) , called in chain(/abc/efg)
__getattr__ used attribute lookup on class instance. __call__ used when class instance used function.
chain() # creates class instance chain().abc # calls __getattr__ returns new instance chain().abc.efg # calls __getattr__ returns new instance chain().abc.efg("string") # calls __call__ __getattr__ can handle strings python recognizes valid variable names. __call__ useful when non-conforming string wanted. so, instance, chain().abc.def("some string spaces") example.
Comments
Post a Comment