Подтвердить что ты не робот

Создание статического класса без экземпляров

Все обучающие программы, которые я вижу в Интернете, показывают, как создавать классы с помощью методов конструктора __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' не определено

4b9b3361

Ответ 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