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