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

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии