2017-03-26 7 views
0

pythonで他のメソッドで使用できるクラスメソッドの外に変数を使用する場合、のinitメソッドを使用すると、基本的に同じそれは誰もが彼らの違いを説明することができます)。いずれかの方法を使用するのが適切な場合Pythonのコード宣言の次の部分とは何ですか?

class gaurab(): 
    value1=1 
    value2=2 
    value3=3 

values=gaurab() 

class something(): 
    def __init__(self): 
     self.value1=1 
     self.value2=100 
    def p(self): 
     print self.value1 

svalues=something() 

print values.value1 

print svalues.p() 
+0

あなたのインデントが間違っています!また、ここで見たいと思っている:http://stackoverflow.com/questions/8959097/what-is-the-difference-between-class-and-instance-variables-in-python – elena

答えて

0

クラスで直接宣言された属性はクラス属性と呼ばれます。 あなたの例のように(インデントや構文が間違っていますが)、value1、value2、およびvalue3はクラスgaurabのクラス属性です。

他の属性内で宣言された属性は、インスタンス属性であり、宣言されているクラス属性にバインドされています。 value1とvalue2のように、変数はのクラスにバインドされています。

クラス属性は、C++、JAVAなどの静的型付き言語で見つかる静的変数と比較されます。 クラス属性はクラスのすべてのインスタンスで共有されるため、そのような属性のコピーは1つだけ作成されますクラスのインスタンスにはインスタンス変数のコピーがあります)。

クラスsomethingのインスタンスが作られると、something__init__方法がselfパラメータで新しいインスタンスを受信し、実行します。このメソッドは、2つのインスタンス属性、すなわちvalue1value2を作成します。次に、このインスタンスはインスタンス変数に割り当てられます。したがって、この2つのインスタンス属性を持つものにバインドされます。例えば

:このクラスの定義については

class foo: 
    def __init__(self): 
     self.Alist=[] #It is an instance attribute 

    Blist=[]    #It is a class attribute 

は、我々として2クラスのインスタンスを作成する場合:Blist属性は両方var1var2しかしAlist属性によって共有されている

var1 = foo() 
var2 = foo() 

のために異なっています両方とも。だから、私たちは次のように操作した場合:

var1.Alist.append(1) 
var1.Blist.append(10) 
var2.Alist.append(2) 
var2.Blist.append(20) 

print(var1.Alist) 
print(var1.Blist) 
print(var2.Alist) 
print(var2.Blist) 

の出力は次のようになります。

[1] 
[10] 
[2] 
[10,20] 

Blist変数がそうvar1var2の両方で共有されたので、これは、変更var1.Blistの場合はvar2.Blistになり、その逆の場合も同様です。 しかし、var1.Alistvar2.Alistは互いに独立しています。

属性をクラスのすべてのインスタンスに共通にしたい場合は、クラス属性として宣言します(必要でない場合はそれをインスタンス属性として宣言できます)。

関連する問題