python - 可以使用@staticmethod 替换@classmethod 并返回该类的实例吗?

标签 python static-methods class-method

我正在阅读 this tutorial@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()

是否可以使用返回其自身类的实例的静态方法代替类方法而没有任何缺点?

最佳答案

当只有一个类时,就像您的示例中那样,classmethodstaticmethod(在其实现中明确命名类)都可以工作。但是,如果您希望将来能够扩展该类,您可能希望使用 classmethod

这是一个基于您的代码的示例:

class ThinCrustPizza(Pizza):
   pass

如果调用 ThinCrustPizza.prosciutto(),您将获得 ThinCrustPizza 的实例,而不是它继承的基类 Pizza方法从。这是因为 classmethod 中的 cls 将是您调用它的类,即子类。

但是,如果您调用 ThinCrustPizza.proscutto2(),您将获得与在 Pizza 上调用它相同的 Pizza 实例,因为实现需要按名称引用 Pizza。因为它没有获取传入的类,所以无法判断它是在子类上调用的。

关于python - 可以使用@staticmethod 替换@classmethod 并返回该类的实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56940509/

相关文章:

python - LXML:KeyError: '@' - element.find ('./@attrname')

python - 从 Adob​​e Premiere/Encoder in Python 和 FFMPEG 中生成的 MP4 获取时间码

Python 3.2 - uWSGI 进程出现段错误

c# - 这些静态变量的可能替代方案是什么?

python - 使用两个不同的装饰器实现装饰所有类方法的元类

namespaces - 如何使用命名空间访问类成员?

android - 从python输入adb shell

java - java中main中声明的变量本质上是静态的吗?

java - 为什么Java不允许覆盖静态方法?

c++ - 类变量中类方法的列表/vector