python 多态 协议 鸭子类型详解


Posted in Python onNovember 27, 2021

接口(python 中的协议)的多种不同的实现方式即为多态。多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。

from abc import ABCMeta, abstractmethod
# 鸭子类
class Dock(metaclass=ABCMeta):
    @abstractmethod
    def Swimming(self):  # 游泳方法协议(接口)
        pass
    @abstractmethod  # 走路协议(接口)
    def Walk(self):
        pass
    @classmethod
    def __subclasshook__(cls, C):
        # 判断是否另一个比较类是否实现了 Swimming Walk 协议, 如果实现了鸭子类的这两个协议,
        # 那么比较类的类型就是一个鸭子类型
        # 当代码执行中如果执行到对象和这个类进行 isinstance 类型判断时会走到这个函数进行判断
        for method in ('Swimming', 'Walk'):
            for B in C.__mro__:
                if method in B.__dict__:
                    if B.__dict__[method] is None:
                        return NotImplemented
                    break
            else:
                return NotImplemented
        return True
# 狗类
class Dog(object):
    # 实现swimming 协议
    def Swimming(self):
        print("狗会狗刨")
    # 实现walk 协议
    def Walk(self):
        print("狗会走路")
    def Eat(self):
        print("狗喜欢吃骨头")
# 乌龟类
class Tortoise(object):
    # 实现swimming 协议
    def Swimming(self):
        print("乌龟会潜水")
    # 实现walk 协议
    def Walk(self):
        print("乌龟会走路")
    def Eat(self):
        print("乌龟喜欢吃鱼")

dog = Dog()
tortoise = Tortoise()
print(isinstance(dog, Dock))         # True
print(isinstance(tortoise, Dock))	 # True

可以看到,在上面的代码中,只要实现了 Dock 类中的 swimming 和 Walk 方法,那么这个类就可以被叫做 Dock 类

应用场景 如: for 循环, 在python 中 for 循环只能用于可迭代对象, 那么, 我自己定义的类实现了 __iter__协议(接口),这个实例类就是一个可迭代对象,可以被for 循环使用

python 中定义协议类协议使用 @abstractmethod 装饰器,@abstractmethod 装饰过的类是不能进行初始化的,相对于c++中的纯虚函数类
这个类只能当做协议(接口)类

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注三水点靠木的更多内容!

Python 相关文章推荐
Eclipse + Python 的安装与配置流程
Mar 05 Python
Python中字典和JSON互转操作实例
Jan 19 Python
python去除所有html标签的方法
May 05 Python
Python中%是什么意思?python中百分号如何使用?
Mar 20 Python
Python实现计算对象的内存大小示例
Jul 10 Python
python内存管理机制原理详解
Aug 12 Python
Django 在iframe里跳转顶层url的例子
Aug 21 Python
40个你可能不知道的Python技巧附代码
Jan 29 Python
Python关于__name__属性的含义和作用详解
Feb 19 Python
logging level级别介绍
Feb 21 Python
PyCharm+Miniconda3安装配置教程详解
Feb 16 Python
python实现商品进销存管理系统
May 30 Python
Python机器学习实战之k-近邻算法的实现
Python Django项目和应用的创建详解
python playwright 自动等待和断言详解
Nov 27 #Python
Python实现制作销售数据可视化看板详解
Python 如何利用ffmpeg 处理视频素材
实操Python爬取觅知网素材图片示例
Python函数中apply、map、applymap的区别
Nov 27 #Python
You might like
PHP SplObjectStorage使用实例
2015/05/12 PHP
php session 写入数据库
2016/02/13 PHP
PHP常用设计模式之委托设计模式
2016/02/13 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
Mootools 1.2教程 定时器和哈希简介
2009/09/15 Javascript
jQuery的强大选择器小结
2009/12/27 Javascript
用jquery实现学校的校历(asp.net+jquery ui 1.72)
2010/01/01 Javascript
Dom在ajax技术中的作用说明
2010/10/25 Javascript
DOM 中的事件处理介绍
2012/01/18 Javascript
js操作输入框提示信息且响应鼠标事件
2014/03/25 Javascript
使用js画图之画切线
2015/01/12 Javascript
jQuery实现鼠标经过提示信息的地图热点效果
2015/04/26 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
2015/06/05 Javascript
深入探秘jquery瀑布流的实现
2016/01/30 Javascript
JavaScript手机振动API
2016/06/11 Javascript
关于 jQuery Easyui异步加载tree的问题解析
2016/12/06 Javascript
React Router基础使用
2017/01/17 Javascript
jQuery实现可以计算进制转换的计算器
2020/10/19 jQuery
[39:32]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第二场
2014/05/23 DOTA
[05:22]DOTA2 2015国际邀请赛中国区预选赛首日TOP10
2015/05/26 DOTA
[13:56]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第一场
2018/04/06 DOTA
[08:47]2018国际邀请赛 OG战队举杯时刻
2018/08/29 DOTA
python实现狄克斯特拉算法
2019/01/17 Python
python如何使用socketserver模块实现并发聊天
2019/12/14 Python
python实现打砖块游戏
2020/02/25 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
2020/04/07 Python
css3实例教程 一款纯css3实现的发光屏幕旋转特效
2014/12/07 HTML / CSS
美津浓美国官网:Mizuno美国
2018/08/07 全球购物
Quiksilver美国官网:始于1969年的优质冲浪服和滑雪板外套
2020/04/20 全球购物
中层干部岗位职责
2013/12/18 职场文书
学校出纳员岗位职责
2014/03/18 职场文书
高中生班主任评语
2014/04/25 职场文书
励志演讲稿300字
2014/08/21 职场文书
教师学期个人总结
2015/02/11 职场文书
《堡垒之夜》联动《刺客信条》 4月7日正式上线
2022/04/06 其他游戏
三种方式清除vue路由跳转router-link的历史记录
2022/04/10 Vue.js