1

この記事の通り

objectname.attributename にアクセスすると、次のオブジェクトの属性が順番に検索されます。

1. オブジェクト自体 (objectname.__dict__または objectname の Python 提供の属性)。

2. オブジェクトのタイプ ( objectname.__class__.__dict__)。のみ__dict__が検索されることに注意してください。これは、クラスのユーザー提供の属性のみを意味します。つまり、存在しobjectname.__bases__ていても何も返さない場合がobjectname.__class__.__bases__あります。

3. オブジェクトのクラスのベース、そのベースなど。(__dict__のそれぞれobjectname.__class__.__bases__)。複数のベースが Python を混乱させることはなく、現時点では気にする必要はありません。注意すべき点は、属性が見つかるまですべてのベースが検索されることです。

理論をテストするために、この例を作成しました

class Superb(object):
    svar=1

class Sub(Superb):
    ...

class Leaf(Sub):
    def __init__(self):
        print(Leaf.svar)

lobj=Leaf()

インスタンスの作成が機能し、Leaf.svar の値が (1 として) 出力されました。これは、Leaf.svar を解決するときに、Python がLeaf オブジェクトのベースのベースを見たことを意味しますが、これは記事では言及されていません。記事によると、オブジェクトのクラス(つまり型) のベースが検索されます。記事の執筆者が間違いを犯したとは思えませんが、それは私の理解のギャップであることは間違いありません。誰かが明確にしてください。

4

2 に答える 2

1

あなた自身の質問に答えるのが公平かどうかはわかりませんが、さらに読んで、オブジェクトが「クラス」の場合、ルールにわずかな変更があることを理解しました。そのため、class.attribute の場合、クラスのベースも検索されます (クラスのクラス、つまり型とともに)。

したがって、class.attribute は次の場所で検索する必要があります

オブジェクト属性 (つまり、クラス定義)

オブジェクトのベース (classname.__ bases __など)

オブジェクトの型 (クラスの場合は「型」)

オブジェクトのクラスのベース (つまり、オブジェクト)

于 2013-04-13T21:10:30.490 に答える