Python3:当子构造函数的参数多于父构造函数时,从继承的方法返回新的子类实例

Python3:当子构造函数的参数多于父构造函数时,从继承的方法返回新的子类实例,python,inheritance,fluent-interface,Python,Inheritance,Fluent Interface,假设我有一个父类和多个子类,它们通过包含关于它们所代表的思想的更具体信息来扩展父类。例如: class Shape: def __init__(self, center): self.center = center class Square(Shape): def __init__(self, center, side_length): super().__init__(self, center) self.side_lengt

假设我有一个父类和多个子类,它们通过包含关于它们所代表的思想的更具体信息来扩展父类。例如:

class Shape:
    def __init__(self, center):
        self.center = center


class Square(Shape):
    def __init__(self, center, side_length):
        super().__init__(self, center)
        self.side_length = side_length
        self.area = side_length ** 2


class Circle(Shape):
    def __init__(self, center, radius):
        super().__init__(self, center)
        self.radius = radius
        self.area = 3.14 * (radius ** 2)
假设我想在父类中实现一个方法,例如
translate(new_center)
,它将返回一个中心位置与原始对象不同的新对象。由于所有子类的行为方式都应该相同(即属性
self.center
应该更改),因此将
translate()
实现为父类形状的方法是有意义的

如果每次调用
translate()
时都要返回类型为
Shape
的新对象,我们可以简单地将
translate()
定义为
Shape
的方法,如下所示:

    def translate(self, new_center):
        return Shape(new_center)
但是,如果任何子类实例调用此方法,结果将是
形状
,因此原始实例包含的任何附加状态信息,例如
边长
正方形
的面积,都将丢失。此外,
translate()
不能定义为

    def translate(self, new_center):
        return self.__class__(new_center)

因为每个子类的构造函数都需要父类构造函数不需要的附加参数。如何在不重写每个子类中的父方法的情况下实现这一点(避免定义父方法的整个要点)?

您可以复制对象并修改副本:

import copy

class Shape():
  def __init__(self, center):
    self.center = center

  def translate(self, new_center):
    new_shape = copy.copy(self) # Replace with deepcopy if needed
    new_shape.center = new_center

...