Python基础之多态与鸭子类型

一、多态与多态性

多态:一种实物有多种形态,一个抽象类(不能实例化)的多个子类。例如动物有多种形态:猫、狗、猪。

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()

多态性:指的是可以在不考虑对象具体类型的情况下而直接使用对象,在设计的时候,把对象的使用方法统一成一种:例如:cat、dog、pig都是动物,但凡是动物都有talk方法,因此可以不用考虑它们三者具体是什么类型的动物而直接使用。即:一个接口,多个实现,具有不同功能的函数可以使用相同的函数名(可以用一个函数名调用不同的函数内容)。

cat.talk()    # 喵喵喵
dog.talk()    # 汪汪汪
pig.talk()    # 哼哼哼

可以定义一个统一的接口来使用

def func_talk(animal):
    animal.talk()

func_talk(cat)    # 喵喵喵
func_talk(dog)    # 汪汪汪
func_talk(pig)    # 哼哼哼

Python中一切皆对象,本身就支持多态性,例如:统计对象的长度。

# 可以在不考虑三者类型的情况下直接使用统计三个对象的长度
s.__len__()
l.__len__()
t.__len__()

# Python内置了一个统一的接口
len(s)
len(l)
len(t)

多态性的本质在于不同的类中定义有相同的方法名,这样就可以不考虑类而统一用一种方式去使用对象,可以通过在父类引入抽象类的概念来硬性限制子类必须有某些方法名。

import abc
# 指定metaclass属性将类设置为抽象类,抽象类本身只是用来约束子类的,不能被实例化
class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod    # 该装饰器限制子类必须定义有一个名为talk的方法
    def talk(self):        # 抽象方法中无需实现具体的功能
        pass

class Cat(Animal):         # 但凡继承Animal的子类都必须遵循Animal规定的准则
    def talk(self):
        print('喵喵喵')

cat = Cat()   # 若子类中没有一个名为talk的方法则会抛出异常TypeError,无法实例化

二、鸭子类型

我们完全可以不依赖于继承,只需要制造出外观和行为相同的对象,同样可以实现不考虑对象类型而使用对象,这就是鸭子类型(duck typing):“如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子”。比起继承的方式,鸭子类型在某种程度上实现了程序的松耦合度。

#二者看起来都像文件,因而就可以当文件一样去用,然而它们并没有直接的关系
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值