Python进阶之多态和鸭子类型

【一】多态

【1】什么是多态

  • 多态指的是一类事物有多种形态

【2】示例

#动物有多种形态:人、狗、猪等
import abc


# 总的类:动物
class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def talk(self):
        pass


# 动物的一类:人
class People(Animal):
    def talk(self):
        print('人会说话')


# 动物的一类:狗
class Dog(Animal):
    def talk(self):
        print('汪汪汪')


# 动物的一类:猪
class Pig(Animal):
    def talk(self):
        print('哼唧哼唧')

【二】多态性

【1】什么是多态性

  • 多态动态绑定在继承的背景下使用时,有时也称为多态性
  • 多态性是指事务的多种形态的性质
  • 在面向对象中一般这样表述多态性:
    • 向不同的对象发送同一条消息
    • 不同的对象在接收时会产生不同的行为
    • 也就是说,每个对象可以用自己的方式去响应共同的消息
    • 所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数

【2】多态性的分类

(1)静态多态性

  • 如任何类型都可以用运算符 + 进行运算

(2)动态多态性

import abc


# 总的类:动物
class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def talk(self):
        pass


# 动物的一类:人
class People(Animal):
    def talk(self):
        print('人会说话')


# 动物的一类:狗
class Dog(Animal):
    def talk(self):
        print('汪汪汪')


# 动物的一类:猪
class Pig(Animal):
    def talk(self):
        print('哼唧哼唧')


people = People()
dog = Dog()
pig = Pig()

# 不用考虑它们具体是什么类型,可以直接使用
people.talk()
dog.talk()
pig.talk()


# 也可以定义一个统一的接口来使用
def func(obj):
    obj.talk()
    
func(people)
func(dog)
func(pig)

【3】多态性的好处

  • 增加了程序的灵活性
  • 增强了代码的可读性和可扩展性

【三】鸭子类型

  • 如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子
  • 但其实我们完全可以不依赖于继承,只需要制造出外观和行为相同对象,同样可以实现不考虑对象类型而使用对象
  • 鸭子类型是一种编程风格,决定一个对象是否有正确的接口
# 狗和鸭子都可以叫,可以喝水,所以狗就可以当成鸭子去用
class Dog():
    def talk(self):
        print(f"可以叫")

    def dink(self):
        print(f'可以喝水')


class Duck():
    def talk(self):
        print(f"可以叫")

    def dink(self):
        print(f'可以喝水')
posted @ 2024-05-10 18:42  Ligo6  阅读(61)  评论(0)    收藏  举报