Создание статического класса без экземпляров
Все обучающие программы, которые я вижу в Интернете, показывают, как создавать классы с помощью методов конструктора __init__
, чтобы можно было объявлять объекты этого типа или экземпляры этого класса.
Как создать класс (статический в Java), чтобы я мог обращаться ко всем методам и атрибутам этого класса без необходимости создавать новые экземпляры/объекты?
Например:
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]))
error: имя 'allAirports' не определено
Ответы
Ответ 1
Пути Pythonic для создания статического класса - это просто объявить эти методы вне класса (Java использует классы как для объектов, так и для группировки связанных функций, но модулей Python достаточно для группировки связанных функций, которые не требуют какого-либо экземпляра объекта). Однако, если вы настаиваете на том, чтобы создать метод на уровне класса, который не требует экземпляра (а не просто делает его самостоятельной функцией в вашем модуле), вы можете сделать это, используя декоратор "@staticmethod".
То есть, путинский путь:
# My module
elements = []
def add_element(x):
elements.append(x)
Но если вы хотите отразить структуру Java, вы можете сделать:
# My module
class World(object):
elements = []
@staticmethod
def add_element(x):
World.elements.append(x)
Вы также можете сделать это с помощью @classmethod
, если вы хотите знать конкретный класс (что может быть удобно, если вы хотите разрешить статический метод наследоваться классом, наследующим от этого класса):
# My module
class World(object):
elements = []
@classmethod
def add_element(cls, x):
cls.elements.append(x)
Ответ 2
Есть два способа сделать это (Python 2.6 +):
статический метод
class Klass(object):
@staticmethod
def static_method():
print "Hello World"
Klass.static_method()
модуль
ваш файл модуля, называемый klass.py
def static_method():
print "Hello World"
ваш код:
import klass
klass.static_method()
Ответ 3
Вы можете использовать classmethod
или 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
имеет преимущество в том, что он будет работать с подклассами, если вам действительно нужна эта функциональность.
конечно, лучше всего.
Ответ 4
Кажется, вам нужен 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