代码之家  ›  专栏  ›  技术社区  ›  G M

是否可以使用@staticmethod替换@classmethod并返回类的实例?

  •  1
  • G M  · 技术社区  · 5 年前

    this tutorial @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 回复  |  直到 5 年前
        1
  •  3
  •   Blckknght    5 年前

    当只有一个类时,比如在你的例子中,那么 classmethod 或者 staticmethod (在实现中显式命名类)可以工作。但是如果您希望将来能够扩展这个类,那么您可能需要使用 .

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

    class ThinCrustPizza(Pizza):
       pass
    

    如果你打电话 ThinCrustPizza.prosciutto() ,您将得到 ThinCrustPizza ,而不是底座 Pizza 它从中继承方法的类。那是因为 cls

    但如果你打电话 ThinCrustPizza.proscutto2() ,你会得到同样的结果 披萨 比如你打电话会得到什么 ,因为实施需要参考 披萨 名字。因为它没有得到传入的类,所以不能判断它是在子类上调用的。