¿Por qué la clase Python no reconoce una variable estática?

Estoy tratando de hacer una clase en Python con variables y métodos estáticos (atributos y comportamientos)

import numpy class SimpleString(): popSize = 1000 displaySize = 5 alphatbet = "abcdefghijklmnopqrstuvwxyz " def __init__(self): pop = numpy.empty(popSize, object) target = getTarget() targetSize = len(target) 

Cuando el código se ejecuta, dice que no puede hacer que la matriz se abra porque PopSize no está definido.

O bien, debe acceder a él con self.popSize o SimpleString.popSize . Cuando declara una variable en una clase para que cualquiera de las funciones de instancia acceda a esa variable, deberá usar self o el nombre de la clase (en este caso SimpleString ), de lo contrario, considerará que cualquier variable en la función es una variable local. a esa función.

La diferencia entre self y SimpleString es que, junto con el self los cambios que realice en popSize solo se reflejarán dentro del scope de su instancia, si crea otra instancia de SimpleString popSize seguirá siendo 1000 . Si usa SimpleString.popSize , cualquier cambio que realice en esa variable se propagará a cualquier instancia de esa clase.

 import numpy class SimpleString(): popSize = 1000 displaySize = 5 alphatbet = "abcdefghijklmnopqrstuvwxyz " def __init__(self): pop = numpy.empty(self.popSize, object) target = getTarget() targetSize = len(target) 

Debe usar self o el objeto class para acceder a los atributos de la clase:

 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) 

La última forma solo es realmente necesaria si desea omitir un atributo de instancia con el mismo nombre:

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

Aquí self.bar es un atributo de instancia (la configuración siempre ocurre en el objeto directamente). Pero como no hay un atributo de instancia baz , self.baz encuentra el atributo de clase en su lugar.