Python 3:当子构造函数的参数多于父构造函数时,从继承的方法返回一个新的子实例 class
Python 3: Returning a new child class instance from an inherited method, when child constructor has more arguments than parent constructor
假设我有一个父 class 和多个子 class,它们通过包含有关它们所代表的想法的更具体信息来扩展父 class。例如:
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)
假设我想在父对象 class 中实现一个方法,例如 translate(new_center)
,这将 return 一个中心位置与原始对象不同的新对象。因为所有子 classes 应该以相同的方式表现(即属性 self.center
应该改变),所以将 translate()
作为父 class Shape 的方法来实现是有意义的。
如果我想在每次调用translate()
时return一个新的Shape
类型的对象,我们可以简单地定义translate()
为[=18]的一个方法=] 像这样:
def translate(self, new_center):
return Shape(new_center)
但是,如果任何子 class 实例调用此方法,结果将是 Shape
类型,因此原始实例包含的任何附加状态信息,例如 side_length
和 area
对于 Square
,将会丢失。此外,translate()
不能定义为
def translate(self, new_center):
return self.__class__(new_center)
因为每个子 class 的构造函数都需要父 class 构造函数不需要的额外参数。我怎样才能实现这个而不必覆盖每个子 classes 中的父方法(避免这是定义父方法的全部要点)?
您可以复制对象并修改副本:
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
...
假设我有一个父 class 和多个子 class,它们通过包含有关它们所代表的想法的更具体信息来扩展父 class。例如:
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)
假设我想在父对象 class 中实现一个方法,例如 translate(new_center)
,这将 return 一个中心位置与原始对象不同的新对象。因为所有子 classes 应该以相同的方式表现(即属性 self.center
应该改变),所以将 translate()
作为父 class Shape 的方法来实现是有意义的。
如果我想在每次调用translate()
时return一个新的Shape
类型的对象,我们可以简单地定义translate()
为[=18]的一个方法=] 像这样:
def translate(self, new_center):
return Shape(new_center)
但是,如果任何子 class 实例调用此方法,结果将是 Shape
类型,因此原始实例包含的任何附加状态信息,例如 side_length
和 area
对于 Square
,将会丢失。此外,translate()
不能定义为
def translate(self, new_center):
return self.__class__(new_center)
因为每个子 class 的构造函数都需要父 class 构造函数不需要的额外参数。我怎样才能实现这个而不必覆盖每个子 classes 中的父方法(避免这是定义父方法的全部要点)?
您可以复制对象并修改副本:
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
...