Узнайте, в чем разница между методом класса, статическим методом и методом экземпляра класса в Python.
В Python вы найдете некоторые методы, украшенные символами @staticmethod или @classmethod, но что именно они будут делать?
Давайте посмотрим на пример, чтобы показать разницу:
class SoftwareEngineer:
alias = "Keyboard Magician" # this is a class variable
def __init__(self, name):
self.name = name # this is an instance variable
# this is an instance method
def code(self, language):
print(f"instance method, {self.name} aka {self.alias} codes in {language}")
@classmethod
def class_code(cls, language):
print(f"class method, {cls.alias} codes in {language}")
# name cannot be accessed!
@staticmethod
def static_code(language):
print(f"static method, codes in {language}")
# name and alias cannot be accessed!
def global_code(language):
print(f"global function, codes in {language}")
Чтобы вызвать метод экземпляра класса code(self, language), нам сначала нужно создать экземпляр класса SoftwareEngineer .
Как для метода класса, так и для статического метода мы можем вызвать соответствующую функцию либо для экземпляра, либо для самого класса, используя или SoftwareEngineer.class_code("Python") SoftwareEngineer.static_code("Python") соответственно. Вывод одинаков для обоих способов вызова функции.
se = SoftwareEngineer("Patrick")
se.code("Python")
# SoftwareEngineer.code("Python") --> Error! not possible
# --> instance method, Patrick aka Keyboard Magician codes in Python
se.class_code("Python")
SoftwareEngineer.class_code("Python")
# --> class method, Keyboard Magician codes in Python
se.static_code("Python")
SoftwareEngineer.static_code("Python")
# --> static method, codes in Python
global_code("Python")
# --> global function, codes in Python
Обратите внимание, что для метода экземпляра класса мы не вставляем self, а для метода класса мы не вставляем cls в вызове функции. Эти аргументы неявно передаются за нас!
Методы экземпляра класса
Методы экземпляра принимают аргумент self и поэтому могут обращаться ко всем переменным и методам экземпляра, таким как self.name, а также ко всем переменным и методам класса, как self.alias здесь.
Их можно использовать только в экземплярах, а не в классе напрямую.
Методы класса
Методы экземпляра принимают аргумент cls и, следовательно, могут обращаться ко всем переменным и методам класса , cls.alias , но не к переменным/методам экземпляра .
Используйте это, когда вам не нужен доступ к переменным, принадлежащим экземпляру, но вам нужны общие атрибуты, принадлежащие классу.
Статические методы
Статические методы не могут получить доступ ни к переменным/методам класса , ни к переменным/методам экземпляра. Они ведут себя как простые (глобальные) функции, за исключением того, что их можно вызывать из экземпляра или класса.
Зачем вам тогда это использовать?
Иногда имеет смысл поместить код в класс, @staticmethod потому что он логически принадлежит этому классу. Вызывая статический метод из класса, мы также объединяем его с пространством имен . Так что при вызове мы сразу видим, что он принадлежит «SoftwareEngineer».