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

Я бы предпочел использовать NULL для ясности того, что требуется и что необязательно. Одно слово предупреждения об использовании значений по умолчанию, которые зависят от других аргументов, как это предлагает Джторп. Значение не задается при вызове функции, но когда аргумент сначала ссылается! Например:

foo <- function(x,y=length(x)){
    x <- x[1:10]
    print(y)
}
foo(1:20) 
#[1] 10

С другой стороны, если вы ссылаетесь на y перед изменением x:

foo <- function(x,y=length(x)){
    print(y)
    x <- x[1:10]
}
foo(1:20) 
#[1] 20

Это немного опасно, потому что это затрудняет отслеживание о том, что инициализируется «y», как если бы она не вызывалась раньше в функции.

41
задан Greg Peckory 31 May 2015 в 11:44
поделиться

2 ответа

Pythonic способ создать статический класс - это просто объявить эти методы вне класса (Java использует классы как для объектов, так и для группировки связанных функций, но модулей Python достаточно для группировки связанных функций, которые не требуют какого-либо экземпляра объекта ). Однако, если вы настаиваете на создании метода на уровне класса, который не требует экземпляра (вместо того, чтобы просто сделать его автономной функцией в вашем модуле), вы можете сделать это с помощью декоратора @staticmethod.

То есть, путь Pythonic будет следующим:

# 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)
62
ответ дан Michael Aaron Safyan 31 May 2015 в 11:44
поделиться

Вы можете использовать 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 и иметь преимущество в том, что он будет работать с подклассами, если вы действительно хотите эту функцию.

модуль, безусловно, лучше.

7
ответ дан Paul Rooney 31 May 2015 в 11:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: