ホームページ  >  に質問  >  本文

python3,定制类,getattr相关用法

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)

看了好久还是理解不了这语句,如能详述一些细节,感激不尽

PHP中文网PHP中文网2765日前520

全員に返信(1)返信します

  • PHPz

    PHPz2017-04-18 10:27:47

    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 が返され、残りは同様です。

    リーリー

    コードフローチャート

    返事
    0
  • キャンセル返事