200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > python中构造方法可以被继承吗_python – 类继承:构造函数应该兼容吗?多重继承

python中构造方法可以被继承吗_python – 类继承:构造函数应该兼容吗?多重继承

时间:2022-02-02 11:46:53

相关推荐

python中构造方法可以被继承吗_python  – 类继承:构造函数应该兼容吗?多重继承

是否建议它也适用于构造函数?我主要考虑Python及其__init __()方法,但这个问题适用于任何具有继承的面向对象语言.

我问这个问题,因为有一个子类从一个或多个类继承,提供一些不错的默认行为(比如从Python继承字典,以便obj [‘key’]适用于新的对象)类).但是,允许子类完全像字典一样使用并不总是自然或简单的:有时候构造函数参数只与特定用户子类相关(例如,代表一组串行端口的类)更好可能希望表现得像端口[‘usb1’]是USB端口#1等字典.这种情况的推荐方法是什么?具有与其基类完全兼容的子类构造函数,并通过对象工厂函数生成实例,该函数采用简单,用户友好的参数?或者只是编写一个类构造函数,其参数集不能直接赋予其基类的构造函数,但从用户角度来看哪个更合乎逻辑?

PS:我误解了上面的Liskov原则:下面的Sven的评论指出了一个子类的对象应该像超类的对象一样的事实(子类本身不必像超类一样;特别是,它们的构造函数没有具有相同的参数[签名]).

解决方法:

根据要求,我发布了以前作为评论的回答.

链接的维基百科文章中定义的原则是“如果S是T的子类型,那么类型T的对象可以用类型S的对象替换”.它不会读取“子类应该以与其基类相同的方式运行”.在考虑构造函数时,差异很重要:维基百科版本仅讨论子类型的对象,而不是类型本身.对于一个对象,已经调用了构造函数,因此该原则不适用于构造函数.这也是我应用它的方式,以及它在标准库中的应用方式(例如defaultdict和dict).

多重继承中的构造函数可能无法以语言无关的方式进行讨论.在Python中,有两种方法.如果您的继承图包含菱形图案,并且您需要确保所有构造函数只被调用一次,则应使用super()并遵循Raymond Hettinger的文章Python’s super() considered super“实用建议”部分中描述的模式.如果您没有钻石(包括对象的钻石除外),您还可以对所有基类构造函数使用显式基类调用.

标签:python,oop,constructor,liskov-substitution-principle

python中构造方法可以被继承吗_python – 类继承:构造函数应该兼容吗?多重继承的情况?...

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。