Узнайте, в чем разница между методом класса, статическим методом и методом экземпляра класса в 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».