Способы предоставления методов в модуле Python:
модуль foo.py
:
def module_method():
return "I am a module method"
class ModClass:
@staticmethod
def static_method():
# the static method gets passed nothing
return "I am a static method"
@classmethod
def class_method(cls):
# the class method gets passed the class (in this case ModCLass)
return "I am a class method"
def instance_method(self):
# An instance method gets passed the instance of ModClass
return "I am an instance method"
сейчас, импорт:
>>> import foo
>>> foo.module_method()
'I am a module method'
>>> foo.ModClass.static_method()
'I am a static method'
>>> foo.ModClass.class_method()
'I am a class method'
>>> instance = ModClass()
>>> instance.instance_method()
'I am an instance method'
Если вы хотите сделать метод класса более полезным, импортируйте класс напрямую:
>>> from foo import ModClass
>>> ModClass.class_method()
'I am a class method'
Вы также можете import ... as ...
сделать его более читабельным:
>>> from foo import ModClass as Foo
>>> Foo.class_method()
'I am a class method'
Какие из них вы должны использовать, это вопрос вкуса. Мое личное правило:
- Простые служебные функции, которые обычно действуют на такие вещи, как коллекции, или выполняют некоторые вычисления или выбирают некоторый ресурс, должны быть модульными методами
- Функции, связанные с классом, но не требующие ни класса, ни экземпляра, должны быть статическими методами
- Функции, которые относятся к классу и нуждаются в классе для сравнения или для доступа к переменной класса, должны быть методами класса.
- Функции, которые будут действовать на экземпляр, должны быть методом экземпляра.