在 Python 中选择类方法而不是继承的问题

Issues of choosing classmethod over inheritance in Python

如果我在 Python?一个 (silly) 的例子是:

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

    def cook(self):        
        print "cooking"
        self.cooked = True

    # A pepperoni pizza using a factory method
    @classmethod
    def Pepperoni(cls):
        return cls("pepperoni")

# An onion pizza inheriting from Pizza base class
class Onion(Pizza):
    def __init__(self):
        ingredient = "onion"
        super(Onion, self).__init__(ingredient)

我知道

还有什么吗?

您似乎认为 Pepperoni 本身就是 class,就像 Onion 一样。 Onion 是一个 class,Pepperoni 只是一个依赖于 Pizza 的函数。当然,不应将 Pepperoni 视为一种正常方法,但确实如此。 classmethod 装饰器有效地将 Pepperoni 方法转换为工厂函数,生成一个新实例。该代码完全等同于只在 class:

之外编写函数
def Pepperoni():
    return Pizza("pepperoni")

你现在不会谈论 "adding custom methods to Pepperoni",但实际上什么都没有改变。