继承使用类方法创建类的新实例的正确方法

2024-05-14 20:37:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我是上帝(或者进化论,或者你相信的任何东西)。我试图用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),但对我来说这似乎不是很好。有没有更合适的方法?你知道吗


Tags: 实例selfreturn定义initdeftype生物
1条回答
网友
1楼 · 发布于 2024-05-14 20:37:19

注意:你改变了你的问题,从一个你的子类采取不同数量的参数。如果您坚持这样的设计,那么在这里您别无选择,只能重写reproduce(),因为没有一致的API来创建“current class”的新实例。你知道吗

如果要标准化类API,还可以标准化创建新实例,此时可以编写一个reproduce()方法,只需type(self)引用当前类,然后继续创建该类的新实例。你知道吗

请注意,必须为每个子类编写一个新的reproduce()方法也是一个很好的选择,因为这是授权创建专门子类的新实例的好方法。你赋予每个子类处理复制细节的责任。你知道吗

但是如果你不想这样做,那么你就从子类中去掉这个责任,把它放在基类中,在这一点上,如何创建实例的基类设计也是基类的责任。你知道吗

当然,这两种选择之间有中间立场,但都归结为某种形式的授权。您可以让基类提供某种结构,详细说明在创建实例时应该跨哪些属性进行复制,您可以让子类实现^{} or ^{} hooks,通过copy.copy()copy.deepcopy()调用等处理“复制”

更新的问题结构只是该委托的另一个示例;您添加了characteristics字典,因此子类负责保持字典的更新,以便基类可以实现如下复制:

def reproduce(self):
    return type(self)(**self.characteristics)

这是完美的python,但更重要的是,这是一个体面的OO设计,您可以选择最小化子类负责的内容,并让基类尽可能多地进行复制。你知道吗

相关问题 更多 >

    热门问题