python - 请问这个语句中打印的变量是类变量还是实例变量?
PHPz
PHPz 2017-04-17 17:40:17
0
5
484
class my_class():
    args1=1
    def fun(self):
        print self.args1
        
my_c=my_class()
my_c.fun()

请问在类里,那个self.args1 是类变量还是实例变量?类变量可以用self.args1用吗?

PHPz
PHPz

学习是最好的投资!

全員に返信(5)
刘奇

クラス空間とインスタンス空間を理解していれば、この問題は非常に簡単になります。クラスには独自の名前空間があり、その内容は className.__dict__ を通じて表示できます。同じ方法でインスタンスをインスタンス化すると、このインスタンスも独自の名前空間を持つことになり、インスタンスのメンバー、メソッドなどを格納するために使用されます。もちろん、インスタンスはクラスのメンバーを確実に共有できます。
具体的には、print self.args1 の場合、まずインスタンスの名前空間内を検索しますが、メンバー args1 が見つからないため、引き続きクラスの空間を検索して args1 を見つけます。したがって、クラスの args1 を出力します。ただし、
self.args1 = 1 などの代入ステートメントがある場合、インスタンスは独自の空間に args1 メンバーを作成します。以下のコードを見てください:

リーリー

上記のコードと組み合わせると、相対的な本質から理解できるはずです

いいねを押す +0
PHPzhong

クラス変数、これはクラスオブジェクトのIDを直接出力することで検証でき、selfが制限するオブジェクトIDがクラスのアドレスとオブジェクトIDが同じであるかどうかを確認できます。これは、Python がデフォルトで最初にインスタンス変数を検索し、見つからない場合はクラス変数を探すため、オブジェクト変数のように見えますが、実際にはクラス変数を参照します。

リーリー

さらに詳しく見てみると、実際、ここでの self はバインドされたオブジェクトのみを表しており、他の変数名で名前を付けることもできます。

リーリー
いいねを押す +0
左手右手慢动作

リーリー

結果は

リーリー

明らかにクラス変数

いいねを押す +0
洪涛

self.args1これはインスタンス変数です。
my_class.args1これはクラス変数です。

リーリー
いいねを押す +0
左手右手慢动作

self.args1 これはインスタンス変数です。
my_class.args1 これはクラス変数です。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート