Можно ли заменить @classmethod с помощью @staticmethod и вернуть экземпляр класса? - PullRequest
1 голос
/ 08 июля 2019

Я читал этот урок на @classmethod и @staticmethod, я не уверен, почему необходимо использовать @classmethod.Я могу получить тот же результат, используя @staticmethod и возвращая экземпляр класса, следуя примеру учебника:

class Pizza:
    def __init__(self, ingredients):
        self.ingredients = ingredients

    @classmethod
    def prosciutto(cls):
        return cls(['mozzarella', 'tomatoes', 'ham'])

    @staticmethod
    def prosciutto2():
        return Pizza(['mozzarella', 'tomatoes', 'ham'])

Мне было интересно, есть ли разница между этими двумя реализациями:

p = Pizza.prosciutto() 
p1 = Pizza.prosciutto2()

Можно ли использовать статический метод, который возвращает экземпляр своего собственного класса, вместо метода класса без каких-либо недостатков?

1 Ответ

3 голосов
/ 08 июля 2019

Когда есть только один класс, как в вашем примере, тогда может работать classmethod или staticmethod (который явно указывает класс в его реализации).Но если вы хотите расширить класс в будущем, вы, вероятно, захотите использовать classmethod.

. Вот пример, который основывается на вашем коде:

class ThinCrustPizza(Pizza):
   pass

Если вывызовите ThinCrustPizza.prosciutto(), вы получите экземпляр ThinCrustPizza, а не базовый класс Pizza, от которого он унаследовал метод.Это потому, что cls в classmethod будет классом, в котором вы вызывали его, который является дочерним классом.

Но если вы вызовете ThinCrustPizza.proscutto2(), вы получите тот же экземпляр Pizza, который выполучил бы от вызова его на Pizza, поскольку реализация должна ссылаться на Pizza по имени.Поскольку класс не передается, он не может сказать, что он был вызван для подкласса.

...