我正在阅读Pro Python3。在第4章中解释了super()类和它的陷阱,最后的结论是:“对这些问题的唯一防御是所有涉及的类之间达成协议,不改变方法签名。”
遗憾的是,我不确定这是什么意思。这不是扼杀了子类化的目的吗?或者,如何在不更改__init__签名的情况下执行以下操作?
class Geometry2d:
def __init__(self, rotation_angle=0, destination=Point(0, 0)):
# do something
class Rectangle(Geometry2d):
def __init__(self, width, height, rotation_angle=0, destination=Point(0, 0)):
super().__init__(rotation_angle, destination)
self.width = width
self.height = height
# ...据我所知,我更改了签名,向子类Rectangle.__init__添加了两个参数(宽度和高度),还更改了参数顺序(参数末尾有默认参数)?
发布于 2019-10-06 06:49:34
不更改子类中的方法签名的原因是,您可以获取类Foo的一个实例,并在该实例上调用Foo的方法,而不需要知道确切的子类来知道要传递什么参数。
这不适用于__init__ (除了在多重继承中,这是很容易弄错多重继承的原因之一)。您总是知道要调用什么__init__ (除了在多重继承中),所以在子类中更改__init__的签名是很好的(除了多重继承)。
https://stackoverflow.com/questions/58252885
复制相似问题