在 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)
我知道
- 我无法(轻松地)向意大利辣香肠添加自定义方法
- 我不能让 Pizza 成为一个抽象的基础 class
还有什么吗?
您似乎认为 Pepperoni
本身就是 class,就像 Onion
一样。 Onion
是一个 class,Pepperoni
只是一个依赖于 Pizza
的函数。当然,不应将 Pepperoni
视为一种正常方法,但确实如此。 classmethod
装饰器有效地将 Pepperoni
方法转换为工厂函数,生成一个新实例。该代码完全等同于只在 class:
之外编写函数
def Pepperoni():
return Pizza("pepperoni")
你现在不会谈论 "adding custom methods to Pepperoni
",但实际上什么都没有改变。
如果我在 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)
我知道
- 我无法(轻松地)向意大利辣香肠添加自定义方法
- 我不能让 Pizza 成为一个抽象的基础 class
还有什么吗?
您似乎认为 Pepperoni
本身就是 class,就像 Onion
一样。 Onion
是一个 class,Pepperoni
只是一个依赖于 Pizza
的函数。当然,不应将 Pepperoni
视为一种正常方法,但确实如此。 classmethod
装饰器有效地将 Pepperoni
方法转换为工厂函数,生成一个新实例。该代码完全等同于只在 class:
def Pepperoni():
return Pizza("pepperoni")
你现在不会谈论 "adding custom methods to Pepperoni
",但实际上什么都没有改变。