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(객체, 이름[, 기본값])
으아악_getattr__은 속성을 동적으로 반환하는 Python의 내장 함수입니다.
존재하지 않는 속성을 호출하면 Python은 __getattr__(self,'score')를 호출하여 속성을 가져오고 점수를 반환합니다.
__str__은 함수를 인쇄하는 데 사용됩니다.
__call__은 클래스를 유사한 함수로 호출합니다.
코드 실행 흐름:
Chain()은 인스턴스를 생성하고 경로는 초기에 ""로 기본 설정됩니다. Chain().a의 경우 클래스에 속성이 없으며 Python 파서가 getattr 함수를 호출합니다. --> __getattr__ (self,path='a'),
체인 인스턴스를 반환한 다음 /a 할당 gei 경로를 전달하고 b를 계속 진행합니다. b 속성이 없기 때문에 getattr 함수를 실행하고 전달합니다. /a/b in,
그런 다음 .user("Michael")는 먼저 getattr을 실행하여 Chain 인스턴스를 반환하지만 () 대괄호가 있으므로 Chain()이 반환됩니다.
이렇게 하면 호출 함수가 호출됩니다. , " ChenTian"이 경로로 전달되고 호출 함수는 /a/b/user/ChenTian을 반환하며 나머지는 유사합니다.
코드 흐름도