4

私はプログラマーではなく、現在 Python を学ぼうとしています。しかし、オブジェクトのインスタンス化について少し混乱しています。クラスはテンプレートのように考えており、オブジェクトはテンプレートに基づいて作成 (またはインスタンス化) されます。オブジェクトが作成されると(例: classinst1 = MyClass() )、テンプレートの変更はオブジェクトの内容に影響を与えるべきではありませんか?

さらに、以下のコードは、オブジェクトの「共通」変数に新しい値を割り当てていない場合にのみ、クラス変数「共通」を変更できることを示しています。オブジェクトの「common」に新しい値を割り当てた場合 (classinst1.common = 99 など)、クラス変数「common」を変更しても、classinst.common 値には影響しません????

以下のコードがそのように動作する理由を誰かが私に説明してもらえますか? それはすべての OO 言語に共通するものですか、それとも python の風変わりな側面の 1 つにすぎませんか?

===============

>>> class MyClass(object):
...     common = 10
...     def __init__(self):
...             self.myvar=3
...     def myfunction(self,arg1,arg2):
...             return self.myvar
... 
>>> classinst1 = MyClass()
>>> classinst1.myfunction(1,2)
3
>>> classinst2 = MyClass()
>>> classinst2.common
10
>>> classinst1.common
10
>>> MyClass.common = 50
>>> classinst1.common
50
>>> classinst2.common
50
>>> classinst1.common = 99
>>> classinst2.common
50
>>> classinst1.common
99
>>> MyClass.common = 7000
>>> classinst1.common
99
>>> classinst2.common
7000
4

1 に答える 1

7

クラス宣言とインスタンス化の権利の一般的な考え方があります。しかし、あなたの例の出力が意味をなさないように見える理由は、実際には と呼ばれる 2 つの変数があるためですcommon。1 つ目は、クラス宣言内のコードの先頭で宣言およびインスタンス化されたクラス変数です。これは、commonほとんどの例でのみです。

この行を実行すると:

classinst1.common = 99

のメンバーであるオブジェクト変数を作成していますclassinst1。これはクラス変数と同じ名前を持っているため、影または非表示になりMyClass.commonます。への以降のすべての参照はそのオブジェクト変数を参照するようになりましたが、 のメンバーであると呼ばれるオブジェクト変数がないため、へclassinst1.commonのすべての参照はclassinst2.common引き続きフォールバックします。MyClass.commoncommonclassinst2

したがって、実行すると:

MyClass.common = 7000

これは変更されますMyClass.commonclassinst1.common、99 に等しいままです。また、例の最後の行で、インタープリターに and の値を要求するclassinst1.commonclassinst2.common、前者はclassinst1オブジェクト メンバー変数commonを参照し、後者はクラス変数を参照しますMyClass.common

于 2013-06-12T22:14:42.997 に答える