天天看点

类的多态与鸭子类型

类的多态与鸭子类型

多态是同一类事物具有的多种形态。

我国有句俗语:“龙生九子,各有不同”。这就是多态。多态是面向对象编程的重要特点之一。

示例:

你、你的姐姐、你的兄弟,都属于人这同一类。这就是多态。

多态性指的是在不考虑对象的具体类型下, 直接使用对象的方法, 同一种调用方式, 运行的效果不一样 (这就需要在设计时, 把对象的调用方法设计成形式统一的一种)

面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数

由多态性的关系, 对象的调用方式可以更进一步, 可以定义一个统一的接口来使用,从而增强了程序的灵活性和可扩展性.

增加了程序的灵活性 : 对于使用者来说都是使用同一种方式去调用每个对象的方法

增加了程序的可扩展性 : 如果我们新建一个类或者又实例出一个对象, 使用者无需更改自己的代码, 还是原来的调用方式

多态的前提是 : 同一类事物, 最好的方法就是让他们继承同一个基类 为了保证多态, 我们可以使用 abc 模块来强制的要求子类必须重写父类的某些功能, 如果不重写, 则会报错 多态性的本质在于不同的类中定义有相同的方法名, 这样我们就可以不考虑类而统一用一种方式去适用对象, 基于这种前提下, 我们还可以进一步使用限制性的思想来提升这种高度. 因此我们可以通过在父类中引入抽象类的概念来硬性限制子类必须有某些方法名

abs 模块不是我们来保证多态的惯用做法, Python中有其他方法可以实现

python中不推荐强制使用父类来约束子类,python推崇使用鸭子类型来实现多态

鸭子类型, 它并不要求严格的继承体系,即一个对象看起来像鸭子, 走路像鸭子, 说话也像鸭子, 具备了鸭子的所有特征和行为, 那么我们就可以说这个对象就是的鸭子

注意:在鸭子类型中,关注点在于对象的行为,能做什么;而不是关注对象所属的类型。

其实我们完全可以不依赖于继承,只需要制造出外观和行为相同对象,同样可以实现不考虑对象类型而使用对象,这正是Python崇尚的“鸭子类型”(duck typing)

比起继承的方式,鸭子类型在某种程度上实现了程序的松耦合度

ps : Python, Go 语言中实现多态可以不需要继承父类, 而其他语言总需要(例:Java)

​​https://www.liaoxuefeng.com/wiki/1016959663602400/1017497232674368​​

​​https://www.jianshu.com/p/e97044a8169a​​