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 相关文章推荐
Python的lambda匿名函数的简单介绍
Apr 25 Python
Python实现PS图像调整黑白效果示例
Jan 25 Python
Python3使用PySynth制作音乐的方法
Sep 09 Python
调试Django时打印SQL语句的日志代码实例
Sep 12 Python
Python实现PyPDF2处理PDF文件的方法示例
Sep 25 Python
Python基于内置库pytesseract实现图片验证码识别功能
Feb 24 Python
如何使用pandas读取txt文件中指定的列(有无标题)
Mar 05 Python
Python使用tkinter实现摇骰子小游戏功能的代码
Jul 02 Python
使用django自带的user做外键的方法
Nov 30 Python
python中round函数保留两位小数的方法
Dec 04 Python
虚拟环境及venv和virtualenv的区别说明
Feb 05 Python
如何用 Python 制作一个迷宫游戏
Feb 25 Python
Python机器学习实战之k-近邻算法的实现
Python Django项目和应用的创建详解
python playwright 自动等待和断言详解
Nov 27 #Python
Python实现制作销售数据可视化看板详解
Python 如何利用ffmpeg 处理视频素材
实操Python爬取觅知网素材图片示例
Python函数中apply、map、applymap的区别
Nov 27 #Python
You might like
WordPress中缩略图的使用以及相关技巧
2015/11/24 PHP
PHP附件下载中文名称乱码的解决方法
2015/12/17 PHP
PHP7.1新功能之Nullable Type用法分析
2016/09/26 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
JavaScript入门教程(12) js对象化编程
2009/01/31 Javascript
原生JS实现响应式瀑布流布局
2015/04/02 Javascript
JS+DIV+CSS实现仿表单下拉列表效果
2015/08/18 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
2015/08/21 Javascript
JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解
2015/12/14 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
2016/06/07 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
vue 请求后台数据的实例代码
2017/06/22 Javascript
element-ui使用导航栏跳转路由的用法详解
2018/08/22 Javascript
jQuery轮播图功能制作方法详解
2019/12/03 jQuery
ES6 async、await的基本使用方法示例
2020/06/06 Javascript
pycharm 使用心得(一)安装和首次使用
2014/06/05 Python
Python实现在线音乐播放器
2017/03/03 Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
2018/01/11 Python
pyhton列表转换为数组的实例
2018/04/04 Python
学习和使用python的13个理由
2019/07/30 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
python3中rank函数的用法
2019/11/27 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
Python如何使用vars返回对象的属性列表
2020/10/17 Python
Cynthia Rowley官网:全球领先的生活方式品牌
2020/10/27 全球购物
main 函数执行以前,还会执行什么代码
2013/04/17 面试题
《维生素c的故事》教学反思
2014/02/18 职场文书
飘柔洗发水广告词
2014/03/14 职场文书
《海伦?凯勒》教学反思
2014/04/17 职场文书
施工协议书范本
2014/04/22 职场文书
动物科学专业求职信
2014/07/27 职场文书
党员教师四风问题对照检查材料
2014/09/26 职场文书
2015年宣传部个人工作总结
2015/05/14 职场文书
聘任通知书
2015/09/21 职场文书
什么是检讨书?检讨书的格式及范文
2019/11/05 职场文书