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

Author: Greg Peckory, 2015-05-31

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)
 38
Author: Michael Aaron Safyan, 2015-05-31 11:49:41

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()
 5
Author: boaz_shuster, 2015-05-31 11:33:25

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.

Mas o módulo é melhor.
 4
Author: Paul Rooney, 2015-06-01 02:42:03

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
 2
Author: Eugene Soldatov, 2015-05-31 11:50:00