面向对象编程之多态性与鸭子类型

本文介绍了多态的概念,即一类事物的不同形态如何通过统一接口调用方法;探讨了多态性的实现条件,包括子类继承和相同的方法;讲解了abc抽象类模块用于约束子类的方法;并提出了鸭子类型的定义,强调基于外观和行为的判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、什么是多态?

二、多态性

三、abc抽象类模块

四、鸭子类型

六、总结


一、什么是多态?

一类事物有多种不同的形态,如:动物有猫、狗、鸡等。

二、多态性

所谓多态性指的是不管各对象是什么数据类型就直接使用各对象中统一的方法函数。 从一定程度上增强了程序的灵活性和可扩展性。

实现条件:

①子类要继承父类

②子类与父类具有相同的方法函数。

class Animal: #同一类事物:动物
    def talk(self):
        pass
class Cat(Animal): #动物的形态之一:猫
    def talk(self):
        print('喵喵喵')
class Dog(Animal): #动物的形态之二:狗
    def talk(self):
        print('汪汪汪')
class Pig(Animal): #动物的形态之三:猪
    def talk(self):
        print('哼哼哼')
 
#实例化得到三个对象
>>> cat=Cat()
>>> dog=Dog()
>>> pig=Pig()

#使用统一的函数接口来调用各对象统一的方法

>>> def Talk(animal):
...     animal.talk()
... 
>>> Talk(cat)
喵喵喵
>>> Talk(dog)
汪汪汪
>>> Talk(pig)
哼哼哼

三、abc抽象类模块

定义抽象父类。抽象父类本身不能实例化,而是用来限制子类必须要有的方法函数,否则子类在实例化对象时会报类型错误。

import abc
 
# 指定metaclass属性将类设置为抽象类,抽象类本身只是用来约束子类的,不能被实例化
class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod # 该装饰器限制子类必须定义有一个名为talk的方法
    def talk(self): # 抽象方法中无需实现具体的功能
        pass
 
class Cat(Animal): # 但凡继承Animal的子类都必须遵循Animal规定的标准
    def talk(self):
        pass
 
cat=Cat() # 若子类中没有一个名为talk的方法则会抛出异常TypeError,无法实例化

四、鸭子类型

不管某物对象是不是真正的鸭子,只要外观(属性)和行为(方法)上看起来像鸭子,那么就认为它就是个鸭子。例如: 定义两个属性和方法都相同的、但没有继承关系的类(具有多态性)。

#二者看起来都像文件,因而就可以当文件一样去用,然而它们并没有直接的关系
class Txt: #Txt类有两个与文件类型同名的方法,即read和write
    def read(self):
        pass
    def write(self):
        pass
 
class Disk: #Disk类也有两个与文件类型同名的方法:read和write
    def read(self):
        pass
    def write(self):
        pass

六、总结

1、多态:  一类事物有多种不同的形态,如动物有猫、狗、鸡。
2、多态性:  不管对象是什么数据类型,直接使用各对象统一的方法函数(实现条件:○子类继承父类○子类和父类具有相同的方法函数)。
 3、abc模块:定义抽象父类。抽象父类本身不能实例化,而是用来限制子类必须要有的方法函数,否则子类在实例化对象时会报类型错误。
import abc
# 指定metaclass属性将类设置为抽象类,抽象类本身只是用来约束子类的,不能被实例化
class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod # 该装饰器限制子类必须定义有一个名为talk的方法
    def talk(self): 
    pass

4、鸭子类型:不管某物对象是不是真正的鸭子,只要外观(属性)和行为(方法)上看起来像鸭子,那么就认为它就是个鸭子。例如: 定义两个属性和方法都相同的、但没有继承关系的类(具有多态性)。

@声明:“山月润无声”博主知识水平有限,文章如有不妥之处欢迎广大IT爱好者指正,小弟定当虚心受教!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Orion.Guan山月润无声

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值