Да, используя декодер staticmethod
class MyClass(object):
@staticmethod
def the_static_method(x):
print x
MyClass.the_static_method(2) # outputs 2
Обратите внимание, что в некотором коде может использоваться старый метод определения статического метода, используя staticmethod
как функцию, а не декоратор. Это следует использовать только в том случае, если вам необходимо поддерживать древние версии Python (2.2 и 2.3)
class MyClass(object):
def the_static_method(x):
print x
the_static_method = staticmethod(the_static_method)
MyClass.the_static_method(2) # outputs 2
. Это полностью идентично первому примеру (используя @staticmethod
), просто не используя приятный декоратор синтаксис
Наконец, используйте staticmethod()
экономно! Очень мало ситуаций, когда в Python необходимы статические методы, и я видел их много раз, когда отдельная функция «верхнего уровня» была бы более ясной.
Ниже приводится дословно из документации: :
Статический метод не получает неявный первый аргумент. Чтобы объявить статический метод, используйте эту идиому:
class C: @staticmethod def f(arg1, arg2, ...): ...
Форма @staticmethod является функцией decorator - см. Описание определений функций в Определения функций для деталей.
Он может быть вызван либо в классе (например,
C.f()
), либо в экземпляре (например,C().f()
). Экземпляр игнорируется, за исключением его класса.Статические методы в Python аналогичны тем, которые были найдены в Java или C ++. Более подробную концепцию см. В
classmethod()
.Дополнительные сведения о статических методах см. В документации по иерархии стандартного типа в . Иерархия стандартного типа .
Новое в версии 2.2.
Изменено в версии 2.4: Добавлен синтаксис конструктора функций.
Вот способ использования sub2ind
. Я не рассчитывал это:
sz = [100 100 100 200];
M = zeros(sz(1)*sz(2)*sz(3), sz(4));
ind = sub2ind(sz([1 2 3]), coordinates(:,1), coordinates(:,2), coordinates(:,3));
M(ind(:),:) = timeseries;
M = reshape(M, sz);
Вы можете немного увеличить скорость, заменив sub2ind
на ручной расчет:
sz = [100 100 100 200];
M = zeros(sz(1)*sz(2)*sz(3), sz(4));
ind = coordinates(:,1) + sz(1)*(coordinates(:,2)-1) + sz(1)*sz(2)*(coordinates(:,3)-1);
M(ind(:),:) = timeseries;
M = reshape(M, sz);