首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在子类化时不改变方法的签名吗?

在子类化时不改变方法的签名吗?
EN

Stack Overflow用户
提问于 2019-10-06 06:42:09
回答 1查看 55关注 0票数 1

我正在阅读Pro Python3。在第4章中解释了super()类和它的陷阱,最后的结论是:“对这些问题的唯一防御是所有涉及的类之间达成协议,不改变方法签名。”

遗憾的是,我不确定这是什么意思。这不是扼杀了子类化的目的吗?或者,如何在不更改__init__签名的情况下执行以下操作?

代码语言:javascript
复制
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__添加了两个参数(宽度和高度),还更改了参数顺序(参数末尾有默认参数)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-06 06:49:34

不更改子类中的方法签名的原因是,您可以获取类Foo的一个实例,并在该实例上调用Foo的方法,而不需要知道确切的子类来知道要传递什么参数。

这不适用于__init__ (除了在多重继承中,这是很容易弄错多重继承的原因之一)。您总是知道要调用什么__init__ (除了在多重继承中),所以在子类中更改__init__的签名是很好的(除了多重继承)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58252885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档