class Chain(object):
def __init__(self,path=""):
self._path = path
def __getattr__(self,path):
return Chain("%s/%s" %(self._path,path))
def __call__(self,path):
return Chain("%s/%s" %(self._path,path))
def __str__(self):
return self._path
__repr__ = __str__
print(Chain().a.b.user("Michael").c.d)
看了好久还是理解不了这语句,如能详述一些细节,感激不尽
PHPz2017-04-18 10:27:47
getattr(object, name[, default])
class Student(object):
def __init__(self):
self.name = 'Michael'
def __getattr__(self,attr):
return attr
s = Student()
s.name
--> 'Michael'
s.score
--> 'score'
_getattr__ is a built-in function in python that dynamically returns an attribute
When calling a non-existent attribute, Python will try to call __getattr__(self,'score') to get the attribute and return score
__str__ is used to print functions
__call__ calls the class as a similar function
Code execution process:
Chain() creates an instance, and the path initially defaults to "". When Chain().a, there is no a attribute in the class, and the Python parser calls the getattr function --> __getattr__(self,path ='a'),
and return a Chain instance, then pass in /a assignment gei path, continue with b, because there is no b attribute, execute the getattr function, pass /a/b in,
then .user(" Michael"), it will first execute getattr to return the Chain instance, but because there are () brackets, it will return Chain(),
This will call the call function, and then pass "ChenTian" as the path, and then call the function /a/b/user/ChenTian is returned, and the rest is similar.
.user("Michael”) 刚开始的user被getattr函数捕获,并返回Chain(),然后再执行__call__来调用 "Michael"
Code flow chart