class my_class(): args1=1 def fun(self): print self.args1 my_c=my_class() my_c.fun()
请问在类里,那个self.args1 是类变量还是实例变量?类变量可以用self.args1用吗?
学习是最好的投资!
クラス空間とインスタンス空間を理解していれば、この問題は非常に簡単になります。クラスには独自の名前空間があり、その内容は className.__dict__ を通じて表示できます。同じ方法でインスタンスをインスタンス化すると、このインスタンスも独自の名前空間を持つことになり、インスタンスのメンバー、メソッドなどを格納するために使用されます。もちろん、インスタンスはクラスのメンバーを確実に共有できます。 具体的には、print self.args1 の場合、まずインスタンスの名前空間内を検索しますが、メンバー args1 が見つからないため、引き続きクラスの空間を検索して args1 を見つけます。したがって、クラスの args1 を出力します。ただし、self.args1 = 1 などの代入ステートメントがある場合、インスタンスは独自の空間に args1 メンバーを作成します。以下のコードを見てください:
className.__dict__
print self.args1
args1
self.args1 = 1
上記のコードと組み合わせると、相対的な本質から理解できるはずです
クラス変数、これはクラスオブジェクトのIDを直接出力することで検証でき、selfが制限するオブジェクトIDがクラスのアドレスとオブジェクトIDが同じであるかどうかを確認できます。これは、Python がデフォルトで最初にインスタンス変数を検索し、見つからない場合はクラス変数を探すため、オブジェクト変数のように見えますが、実際にはクラス変数を参照します。
さらに詳しく見てみると、実際、ここでの self はバインドされたオブジェクトのみを表しており、他の変数名で名前を付けることもできます。
リーリー
結果は
明らかにクラス変数
self.args1これはインスタンス変数です。 my_class.args1これはクラス変数です。
self.args1
my_class.args1
self.args1 これはインスタンス変数です。 my_class.args1 これはクラス変数です。
クラス空間とインスタンス空間を理解していれば、この問題は非常に簡単になります。クラスには独自の名前空間があり、その内容は
リーリーclassName.__dict__
を通じて表示できます。同じ方法でインスタンスをインスタンス化すると、このインスタンスも独自の名前空間を持つことになり、インスタンスのメンバー、メソッドなどを格納するために使用されます。もちろん、インスタンスはクラスのメンバーを確実に共有できます。具体的には、
print self.args1
の場合、まずインスタンスの名前空間内を検索しますが、メンバーargs1
が見つからないため、引き続きクラスの空間を検索して args1 を見つけます。したがって、クラスの args1 を出力します。ただし、self.args1 = 1
などの代入ステートメントがある場合、インスタンスは独自の空間に args1 メンバーを作成します。以下のコードを見てください:上記のコードと組み合わせると、相対的な本質から理解できるはずです
クラス変数、これはクラスオブジェクトのIDを直接出力することで検証でき、selfが制限するオブジェクトIDがクラスのアドレスとオブジェクトIDが同じであるかどうかを確認できます。これは、Python がデフォルトで最初にインスタンス変数を検索し、見つからない場合はクラス変数を探すため、オブジェクト変数のように見えますが、実際にはクラス変数を参照します。
リーリーさらに詳しく見てみると、実際、ここでの self はバインドされたオブジェクトのみを表しており、他の変数名で名前を付けることもできます。
リーリーリーリー
結果は
リーリー明らかにクラス変数
リーリーself.args1
これはインスタンス変数です。my_class.args1
これはクラス変数です。self.args1 これはインスタンス変数です。
my_class.args1 これはクラス変数です。