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)
看了好久还是理解不了这语句,如能详述一些细节,感激不尽
getattr(オブジェクト, 名前[, デフォルト])
リーリー_getattr__ は、属性を動的に返す Python の組み込み関数です
存在しない属性を呼び出すと、Python は __getattr__(self,'score') を呼び出して属性を取得し、スコアを返そうとします
__str__ は関数を出力するために使用されます
__call__ は同様の関数としてクラスを呼び出します
コード実行プロセス:
リーリーChain() はインスタンスを作成し、パスは最初はデフォルトの "" になります。Chain().a の場合、クラスには属性がなく、Python パーサーは getattr 関数を呼び出します。 __getattr__(self,path ='a'),
そして Chain インスタンスを返し、/a 割り当て gei パスを渡し、b 属性がないので b を継続し、getattr 関数を実行し、/a/b を渡します、
次に .user(" Michael") を実行すると、まず getattr を実行して Chain インスタンスを返しますが、() 括弧があるため Chain() を返します。
これにより call 関数が呼び出され、「ChenTian」が次のように渡されます。パスを指定して関数を呼び出すと、/a/b/user/ChenTian が返され、残りは同様です。
コードフローチャート