首页 > 编程语言 >Python进阶之多态和鸭子类型

Python进阶之多态和鸭子类型

时间:2024-05-10 18:56:19浏览次数:23  
标签:进阶 Python 多态性 self 多态 talk print class def

【一】多态

【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'可以喝水')

标签:进阶,Python,多态性,self,多态,talk,print,class,def
From: https://www.cnblogs.com/ligo6/p/18183500

相关文章

  • Python进阶之绑定方法和非绑定方法
    【一】绑定方法和非绑定方法介绍【1】绑定方法绑定给谁,谁来调用就自动将它本身当作第一个参数传入(1)绑定到类的方法用classmethod装饰器装饰的方法为类量身定制类.boud_method(),自动将类当作第一个参数传入其实对象也可调用,但仍将类当作第一个参数传入(2)绑定到对象的方......
  • Python进阶之反射
    【一】什么是反射反射是一种程序可以访问、检测和修改其本身状态或行为的能力在Python中,反射主要指通过字符串的形式操作对象的属性python中的一切事物都是对象,都可以使用反射【二】反射方法getattr(object,key):获取对象的属性值,如果属性不存在,可提供默认值hasattr(ob......
  • Python进阶之内置方法
    【一】内置方法引入__init__ :初始化对象时触发__del__ :删除类时触发__new__ :构造类时触发__str__ :str函数或者print函数触发__repr__ :repr或者交互式解释器触发__doc__ :打印类内的注释内容__enter__ :打开文档触发__exit__ :关闭文档触发__getattr__:访问不存在的属......
  • python 实现类重载(类似C#的类重载,但是远不如C#的类重载好用)
    pipinstallmultipledispatch-ihttps://mirrors.aliyun.com/pypi/simplefrommultipledispatchimportdispatchclassMyClass:ab=11234def__init__(self):self.aa=1@dispatch()defcalculate(self):self.aa=1111......
  • 分享一个使用python调用websocket获取实时行情数据的方法
    这个站点可以获取:外汇、国际期货、国内期货、贵金属、能源、虚拟货币、股指期货、美股、台股、港股、印度股、A股、ETF等以下是Python的连接demo,可以参考下。同时也支持其他后端语言的连接,PHP、Java等。获取品种地址:http://39.107.99.235:1008/market/market.phpimportj......
  • Python进阶之抽象类
    【一】什么是抽象类与java一样,python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化【二】为什么要有抽象类如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据......
  • Python进阶之封装
    【一】面向对象的三大特性面向对象的三大特性:封装、继承、多态其中最重要的就是封装,封装就是将数据和功能整合到一起我们可以对封装在类和对象中的属性进行访问的控制,有隐藏的和开发的接口【1】什么是封装封装是对具体对象的一种抽象封装就是将某些数据和功能隐藏起来,只......
  • Python-有序字典OrderedDict练习题
    问题:读取键盘输入结果,创建n个键值对,将其排序后放入有序字典并输出。详细描述:根据提示,实现函数功能:读取n(n>0)行输入,以每一行的数据为key,行号(从0开始)为value,建立n对键值对,然后将他们按照key排序后,放入一个有序字典,最后输出这个有序字典。importcollectionsdefFunc():pairs......
  • python教程10-集合
    集合(set)是一个无序的不重复元素序列。集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作。可以使用大括号 {} 创建集合,元素之间用逗号 , 分隔,或者也可以使用 set() 函数创建集合。集合创建:注意:创建一个空集合必须用 set() 而不是 {},因为 {} ......
  • python教程10-元祖
    元组(tuple)与列表类似,不同之处在于元组的元素不能修改。因此很少使用元组使用小括号 (),列表使用方括号 [] 元组中只包含一个元素时,需要在元素后面添加逗号 , ,否则括号会被当作运算符使用:元祖调用:修改元祖元组中的元素值是不允许修改的,但我们可以对元组进行连接组......