この記事の通り
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 オブジェクトのベースのベースを見たことを意味しますが、これは記事では言及されていません。記事によると、オブジェクトのクラス(つまり型) のベースが検索されます。記事の執筆者が間違いを犯したとは思えませんが、それは私の理解のギャップであることは間違いありません。誰かが明確にしてください。