web-dev-qa-db-fra.com

Création d'une classe statique sans instance

Tous les tutoriels que je vois en ligne montrent comment créer des classes avec __init__ méthodes constructeur afin de pouvoir déclarer des objets de ce type, ou des instances de cette classe.

Comment créer une classe (statique en Java) pour pouvoir accéder à toutes les méthodes et attributs de cette classe sans avoir à créer de nouvelles instances/objets?

Par exemple:

class World:

    allElems = []

    def addElem(x):  

        allElems.append(x)

World.addElem(6)
print(World.allElems)

MODIFIER

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

erreur: le nom 'allAirports' n'est pas défini

42
Greg Peckory

La méthode Pythonic pour créer une classe statique consiste simplement à déclarer ces méthodes en dehors d’une classe (Java utilise des classes à la fois pour les objets et pour le groupement de fonctions associées, mais les modules Python suffisent Cependant, si vous insistez pour créer une méthode au niveau de la classe qui ne nécessite pas d’instance (au lieu de simplement en faire une fonction indépendante dans votre module), vous pouvez le faire en utilisant le décorateur "@staticmethod".

C'est-à-dire que la manière pythonique serait:

# My module
elements = []

def add_element(x):
  elements.append(x)

Mais si vous voulez refléter la structure de Java, vous pouvez faire:

# My module
class World(object):
  elements = []

  @staticmethod
  def add_element(x):
    World.elements.append(x)

Vous pouvez aussi le faire avec @classmethod _ si vous souhaitez connaître la classe spécifique (ce qui peut être utile si vous souhaitez autoriser l'héritage de la méthode statique par une classe héritant de cette classe):

# My module
class World(object):
  elements = []

  @classmethod
  def add_element(cls, x):
    cls.elements.append(x)
68

Il y a deux façons de faire cela (Python 2.6+):

méthode statique

class Klass(object):
    @staticmethod
    def static_method():
        print "Hello World"

Klass.static_method()

module

votre fichier de module, appelé klass.py

def static_method():
    print "Hello World"

votre code:

import klass

klass.static_method()
10
boaz_shuster

Vous pouvez utiliser un 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 a l'avantage de fonctionner avec des sous-classes, si vous vouliez vraiment cette fonctionnalité.

le module est certainement le meilleur cependant.

7
Paul Rooney

Il semble que vous ayez besoin de classmethod:

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