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)
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
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)
Il y a deux façons de faire cela (Python 2.6+):
class Klass(object):
@staticmethod
def static_method():
print "Hello World"
Klass.static_method()
votre fichier de module, appelé klass.py
def static_method():
print "Hello World"
votre code:
import klass
klass.static_method()
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.
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