【发布时间】:2019-01-12 00:36:02
【问题描述】:
我是上帝(或进化,或任何你相信的东西)。我正在尝试用 Python 创造所有生物。
我已经定义了一个能够“复制”的类,即能够创建自己的新实例(忽略它看起来更像是克隆而不是复制的事实,这是针对地球的 beta 版本):
class Animal:
def __init__(self, **kwargs):
self.characteristics = kwargs
def reproduce(self):
return Animal(**self.characteristics)
这在基类的情况下工作得很好,但是当我创建一个继承自 Animal 的类时会发生什么?
class Fox (Animal):
def __init__ (self, **kwargs):
self.color = 'red'
super().__init__(dict(self.color, **kwargs))
如果Fox 尝试reproduce,我将有一个Animal 类型的实例而不是Fox(即使它仍然具有'red' 的颜色)。
我可以重载方法让狐狸能够繁殖:
def reproduce(self):
return Fox(self.characteristics)
但是,我必须为我定义的每一个新生物都这样做!
我如何创建一个类,我可以让我的所有生物都从中继承,所以当它们reproduce 创建同一个类的对象时?这样我就可以确定:
parent = Fox()
child = parent.reproduce()
assert type(parent) == type(child)
我知道我可以使用type 使reproduce 返回type(self)(self.characteristics) 或self.__class__(**self.characteristics),但它对我来说似乎不是很严重。有没有更合适的方法来做到这一点?
【问题讨论】:
-
type(self)()非常合适,但为此,您的所有构造函数都需要相同,但事实并非如此。 -
你说得对,我将重新提出我的问题,让覆盖成为唯一的解决方案
-
我们需要在这里找到一个中间立场。我在下面的回答仍然回答了您更新的问题,但现在这个答案读起来很尴尬,因为您突然实现了我提到的“委托属性”选项。答案在这里仍然是一样的,但我宁愿看到你的问题回到它的起点。
-
(请注意我的
reproduce()使用self.characteristics的方式与您使用它的方式之间的区别;您的版本会导致类型错误,因为__init__不接受任何超出self的位置参数)。
标签: python python-3.x