1
class ClassA:
    A = 10
    def __init__(self):
        self.a = 10
        self.b = 20

    def methodA(self):
        return self.A

 obj = ClassA()
 print(obj.methodA()) # returns 10

これには明らかに制限があり、I obj は「A」という名前の属性を持ちません。しかし、なぜ python は 'A' を介して公開したのでしょうかself.AClassA.A代わりに元に戻した方が良いですか?

4

1 に答える 1

3

これは完全に設計によるものです。

クラスのメソッドは、クラスの属性でもあります (ただし、ディスクリプタでもあることで強化されています)。これもどのself.methodA()ように配置されますか。

Python は、最初にインスタンスの属性を検索し、次にクラス、次にクラスの基本クラスを検索します。

設定 self.Aは引き続きインスタンスに値を設定するため、クラス属性がマスクされることに注意してください。これにより、クラスは属性のデフォルト値を指定し、後でインスタンスの値に置き換えることができます。

ClassA.Aこれはすべて、直接アクセスしてインスタンス ディクショナリをバイパスすることを妨げるものではありません。共有値を変更したい場合ClassA.Aは、上記の理由で直接割り当てる必要があります。

于 2013-11-07T17:08:40.487 に答える