【发布时间】:2022-01-23 00:48:52
【问题描述】:
假设我有一个类 Fruit 和它的两个子类 Orange(Fruit) 和 Banana(fruit)
Fruit 有一个初始化器,我向它传递了一些参数。但我不希望它仅仅创建并返回一个 fruit,而是根据传递给它的参数,可能返回它的几个不同 子类 之一。例如:
Fruit(color="yellow") 可能返回 Banana 对象,而 Fruit(color="orange") 将返回 Orange。
我该怎么做?我不能在__init__ 中这样做,因为已经创建了该类。我尝试在__new__ 中执行此操作,但结果很混乱,因为我可以会创建子类(如预期的那样),但随后会递归调用超类的__new__。
我的解决方法是只定义一个 Fruit.create() 静态方法来创建适当的子类,但这似乎有点不符合 Python 风格。
有没有“正确”的方法来做到这一点?
【问题讨论】:
-
这似乎有点倒退,Fruit 是一个类,所以你为什么期望它在初始化时返回一个不同的类。这似乎比创建一个为您提供正确水果类的静态方法更不合常理
-
@ChrisDoyle 如果你告诉别人给你一个水果,他们给了你一个香蕉,他们会错吗? ;-)
-
我不反对向水果索取的工厂方法。对我来说似乎是
var = foo()的想法,其中 foo 是一个类,但最终从它的 init 返回的不是foo的实例,而是bar的实例。但是在fruit中调用工厂方法来获取子类是有意义的
标签: python python-3.x