2016-12-22 4 views
0

少し説明が必要です。一つのオブジェクトの操作は、例えば、他の人の変更を行います。ここではオブジェクトの操作によって他のものが変更される

aa = Classifier("aa") 
bb = Classifier("bb") 

aa.print_table() 
{1: 6, 2: 26} 

bb.print_table() 
{1: 6, 2: 26} 

aa.addValue(3) 

bb.print_table() 
{1: 6, 2: 26, 3: 1} 

は私のクラスの一部です:

class Classifier: 

classTable = {1:0} 
default = 0 
classTable_size = 0 
def __init__(self, q): 
    a = 1 
    self.name = q 

def addValue(self, i_index): 
    self.classTable.setdefault(i_index, self.default) 
    self.classTable[i_index] += 1 
    self.classTable_size += 1 

def print_table(self): 
    print(self.classTable) 

私はクラスの先頭に変数を定義する場合(この場合は、コンストラクタの前に)それは静的にするか、クラスにエラーがありますか?私は、この方法で変数を定義することは、自分のオブジェクトからしか利用できないと考えていました。

私はPythonで非常に新しいです。

+1

Pythonの静的な概念は、JavaのC#のものとまったく同じではありません。 – yorodm

答えて

0

例:クラスA

class A: 

    data = {} 

    def __str__(self): 
     return str(self.data) 

class B: 

    data = {} 

    def __init__(self): 

     self.data = {'B': 5} 

    def __str__(self): 
     return str(self.data) 

インスタンスが独自にdataを所有していません。それは '静的'であり、self.dataA.dataでアクセスすることができます(つまり、Pythonがオブジェクト内の変数を調べる方法です)。self.dataが存在しない場合、PythonはA.dataを探します。どちらも同じ辞書を参照しています。 self.data(またはA.data)への変更は、すべてのインスタンスに影響します。あなたは、インスタンスのために、新鮮なdataメンバーを追加する場合を除き、

a = A() 
a.data.update({'A': 3}) 
print(a) # -> {'A': 3} 
aa = A() 
print(aa) # -> {'A': 3} 

を。これは唯一のインスタンスに属しています:すべてのインスタンスが __init__「コンストラクタ」で、独自の新鮮な辞書を取得します

aa.data = {} # data references now this empty dict and not A.data anymore 
print(a) # -> {} 
print(aa) # -> {'A': 3} 

class Bに - 「静的」dataメンバーがあっても。あるインスタンスの変更は他のインスタンスに影響しません。 self.dataB.dataとは異なるオブジェクトになりました。

通常、多分thisは読む価値がある...同じ名前で

クラス変数(B.data)を持つことは悪い考えで、インスタンス変数(self.data)。そこにはPythonに関する多くの情報があります。

関連する問題