Criar uma classe estática sem instâncias
todos os tutoriais que vejo online mostram como criar classes com {[[2]} métodos de construção para que se possa declarar objectos desse tipo, ou instâncias dessa classe.
Como posso criar uma classe (estática em Java) para que possa aceder a todos os métodos e atributos dessa classe sem que tenha de criar novas instâncias/objectos?
por exemplo:
class World:
allElems = []
def addElem(x):
allElems.append(x)
World.addElem(6)
print(World.allElems)
editar
class World(object):
allAirports = []
@staticmethod
def initialize():
f = open(os.path.expanduser("~/Desktop/1000airports.csv"))
file_reader = csv.reader(f)
for col in file_reader:
allAirports.append(Airport(col[0],col[2],col[3]))
erro: o nome 'allAirports' não está definido
4 answers
A forma Pitónica de criar uma classe estática é simplesmente declarar esses métodos fora de uma classe (Java usa classes tanto para objectos como para agrupar funções relacionadas, mas os módulos Python são suficientes para agrupar funções relacionadas que não requerem qualquer instância de objecto). No entanto, se você insistir em fazer um método no nível de classe que não requer uma instância (ao invés de simplesmente torná-la uma função independente em seu módulo), você pode fazê-lo usando o "@staticmethod" decorador.
Ou seja, o caminho Pitônico seria:# My module
elements = []
def add_element(x):
elements.append(x)
Mas se você quiser espelhar a estrutura de Java, você pode fazer:
# My module
class World(object):
elements = []
@staticmethod
def add_element(x):
World.elements.append(x)
Você também pode fazer isto com {[3] } Se quiser saber a classe específica (que pode ser útil se quiser permitir que o método estático seja herdado por uma classe que herda desta classe):
# My module
class World(object):
elements = []
@classmethod
def add_element(cls, x):
cls.elements.append(x)
Existem duas maneiras de fazer isso (Python 2.6+):
Método estático
class Klass(object):
@staticmethod
def static_method():
print "Hello World"
Klass.static_method()
Módulo
O ficheiro do módulo, chamado klass.py
def static_method():
print "Hello World"
O seu código:
import klass
klass.static_method()
Podias usar um classmethod
ou staticmethod
class Paul(object):
elems = []
@classmethod
def addelem(cls, e):
cls.elems.append(e)
@staticmethod
def addelem2(e):
Paul.elems.append(e)
Paul.addelem(1)
Paul.addelem2(2)
print Paul.elems
classmethod
tem a vantagem de que ele iria trabalhar com sub classes, se você realmente queria essa funcionalidade.
Parece que precisas de um método de classe:
class World(object):
allAirports = []
@classmethod
def initialize(cls):
if not cls.allAirports:
f = open(os.path.expanduser("~/Desktop/1000airports.csv"))
file_reader = csv.reader(f)
for col in file_reader:
cls.allAirports.append(Airport(col[0],col[2],col[3]))
return cls.allAirports