2013-11-14 8 views
9

を認識していないなぜPythonのクラスは、私は静的変数やメソッド(属性や行動)をPythonでクラスを作るしようとしています静的変数

import numpy 

class SimpleString():  
    popSize = 1000 
    displaySize = 5 
    alphatbet = "abcdefghijklmnopqrstuvwxyz " 

    def __init__(self): 
     pop = numpy.empty(popSize, object) 
     target = getTarget() 
     targetSize = len(target) 

それは配列を作ることができないと言われてもコードが実行されるとPopSizeが定義されていないためにポップする

+2

属性は常に 'self'でアクセスする必要があります(例:' self.popSize')。 – BrenBarn

+0

または 'SimpleString.popSize' ....静的なクラス変数の場合...(自己変更でアクセスするとclassvariableに反映されません) –

+3

アルファベットのスペルが間違っています;-) GRAMMAR NAZI ftw – jth41

答えて

19

self.popSizeまたはSimpleString.popSizeでアクセスする必要があります。任意のインスタンス関数がその変数にアクセスするためにクラス内の変数を宣言するときは、selfまたはクラス名(この場合はSimpleString)を使用する必要があります。それ以外の場合は、関数内の変数をローカル変数その機能に

selfSimpleStringの違いは、あなたはまだ1000なりますSimpleStringpopSizeの別のインスタンスを作成した場合selfであなたがpopSizeに加えた変更のみが、あなたのインスタンスの範囲内で反映されるということです。 SimpleString.popSizeを使用すると、その変数に加えた変更はそのクラスのインスタンスに伝播されます。あなたがアクセスクラスへselfまたはクラスのオブジェクトを使用する必要が

import numpy 

class SimpleString():  
    popSize = 1000 
    displaySize = 5 
    alphatbet = "abcdefghijklmnopqrstuvwxyz " 

    def __init__(self): 
     pop = numpy.empty(self.popSize, object) 
     target = getTarget() 
     targetSize = len(target) 
2

属性:

def __init__(self): 
    pop = numpy.empty(self.popSize, object) 
    target = getTarget() 
    targetSize = len(target) 

または

def __init__(self): 
    pop = numpy.empty(SimpleString.popSize, object) 
    target = getTarget() 
    targetSize = len(target) 

をあなたは、インスタンスをバイパスしたい場合は後者の形式は、実際には必要とされています同じ名前の属性:

>>> class Foo(object): 
...  bar = 42 
...  baz = 42 
...  def __init__(self): 
...   self.bar = 38 
...  def printBar(self): 
...   print self.bar, Foo.bar 
...  def printBaz(self): 
...   print self.baz, Foo.baz 
... 
>>> f = Foo() 
>>> f.printBar() 
38 42 
>>> f.printBaz() 
42 42 

ここではself.barがインスタンス属性です(設定は常にオブジェクトで直接行われます)。しかし、bazインスタンス属性がないため、代わりにself.bazがクラス属性を検出します。

+0

で、あるクラスインスタンスでそれを変更し、他のクラスインスタンスに反映された変更を確認したい場合は後者も使用します(静的変数のように:P) –

+0

@ JoranBeasley:ここでは「静的変数」という用語は本当に間違っています。 Pythonには「クラス属性」と「インスタンス属性」があります。 –

+0

はいしかし、クラス属性は他の言語の静的変数のように振る舞います(ほとんどの場合)... –

関連する問題