2013-11-14 36 views
9

Sto cercando di fare una classe in Python con variabili e metodi statici (attributi e comportamenti)Perché classe Python non riconoscere variabile statica

import numpy 

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

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

Quando il codice viene eseguito se si dice che non si può fare la matrice pop perché popSize non è definito

+2

Gli attributi devono sempre essere accessibili con 'self', ad esempio' self.popSize'. – BrenBarn

+0

o 'SimpleString.popSize' .... quando è una variabile di classe statica ... (se accedete con le modifiche automatiche non rifletteranno alla classe classificata) –

+3

avete sbagliato l'alfabeto ;-) GRAMMAR NAZI ftw – jth41

risposta

19

È necessario accedervi con uno self.popSize o SimpleString.popSize. Quando si dichiara una variabile in una classe affinché una qualsiasi delle funzioni di istanza acceda a tale variabile, sarà necessario utilizzare self o il nome della classe (in questo caso SimpleString) altrimenti tratterà qualsiasi variabile nella funzione come variabile locale a quella funzione.

La differenza tra self e SimpleString è che con self le modifiche apportate al popSize si rifletteranno solo nell'ambito dell'istanza, se si crea un'altra istanza di SimpleStringpopSize sarà ancora 1000. Se si utilizza SimpleString.popSize, qualsiasi modifica apportata a tale variabile verrà propagata a qualsiasi istanza di tale classe.

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

È necessario utilizzare self o l'oggetto di classe per classe di accesso attributi:

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

o

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

Quest'ultima forma è realmente necessario solo se si desidera ignorare un'istanza attributo con lo stesso nome:

>>> 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 

Qui self.bar è un attributo di istanza (l'impostazione avviene sempre direttamente sull'oggetto). Ma poiché non esiste alcun attributo di istanza baz, self.baz trova invece l'attributo di classe.

+0

si dovrebbe utilizzare anche quest'ultimo se si desidera modificarlo in un'istanza di classe e vedere la modifica riflessa in altre istanze di classe (come una variabile statica: P) –

+0

@JoranBeasley: il termine 'variabile statica' è davvero fuori luogo qui; Python ha "attributi di classe" e "attributi di istanza". –

+0

sì, tuttavia gli attributi di classe si comportano come variabili statiche in altre lingue (per la maggior parte) ... –

Problemi correlati