Основным отличием является то, что вы можете использовать функцию, декорированную статическим методом, без создания экземпляра класса,
но если вы сделаете подфункцию / внутреннюю функцию, вы не сможете получить к ней доступ из внешней функции, где она была определена.
Метод
Без создания экземпляра:
In [2]: Pizza.cook()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-4a252d4e9619> in <module>()
----> 1 Pizza.cook()
TypeError: cook() missing 1 required positional argument: 'self'
С экземпляром:
In [4]: Pizza('cheese', 'vegetables').cook()
Out[4]: 'cheesevegetables'
Статический метод
Без создания экземпляра:
In [5]: Pizza.mix_ingredients(1,2)
Out[5]: 3
Производительность:
Каждый раз, когда вы вызываете cook_pizza
, он определяет вложенную функцию, которая влияет на время выполнения.
import timeit
def method():
return 'method'
def method_with_inner():
def inner():
return 'inner'
return inner()
Исполнение
print(timeit.timeit("method()", setup="from __main__ import method"))
+0,0910306089790538
print(timeit.timeit("method_with_inner()", setup="from __main__ import method_with_inner"))
0,24090809898916632
примечание
cook_pizza
может быть статическим методом, так как он не использует переменную, определенную на уровне класса или хранилище в себе.
Спасибо: @Shadow @abarnert за вклад в ветку обсуждения этого ответа.