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写的windows服务不能启动的问题
Apr 15 Python
python实现K近邻回归,采用等权重和不等权重的方法
Jan 23 Python
python selenium执行所有测试用例并生成报告的方法
Feb 13 Python
PyTorch的深度学习入门教程之构建神经网络
Jun 27 Python
python 画二维、三维点之间的线段实现方法
Jul 07 Python
python实现统计代码行数的小工具
Sep 19 Python
详解Python3 中的字符串格式化语法
Jan 15 Python
浅谈matplotlib.pyplot与axes的关系
Mar 06 Python
Django 5种类型Session使用方法解析
Apr 29 Python
基于Python脚本实现邮件报警功能
May 20 Python
python tkinter Entry控件的焦点移动操作
May 22 Python
python开发人人对战的五子棋小游戏
May 02 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操作MongoDB时的整数问题及对策说明
2011/05/02 PHP
去除php注释和去除空格函数分享
2014/03/13 PHP
PHP给文字内容中的关键字进行套红处理
2016/04/12 PHP
php实现的网页版剪刀石头布游戏示例
2016/11/25 PHP
JQuery 学习笔记 选择器之一
2009/07/23 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
JavaScript中关键字 in 的使用方法详解
2016/10/17 Javascript
javascript创建对象的3种方法
2016/11/02 Javascript
详解微信小程序 页面跳转 传递参数
2016/12/08 Javascript
js数组方法reduce经典用法代码分享
2018/01/07 Javascript
动态加载权限管理模块中的Vue组件
2018/01/16 Javascript
代码详解javascript模块加载器
2018/03/04 Javascript
Layui Form 自定义验证的实例代码
2019/09/14 Javascript
vuex存储token示例
2019/11/11 Javascript
Node.js API详解之 net模块实例分析
2020/05/18 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
python Django模板的使用方法(图文)
2013/11/04 Python
Python reduce()函数的用法小结
2017/11/15 Python
对python GUI实现完美进度条的示例详解
2018/12/13 Python
使用python实现ftp的文件读写方法
2019/07/02 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
python实现证件照换底功能
2019/08/20 Python
详解Django将秒转换为xx天xx时xx分
2019/09/27 Python
python实现文字版扫雷
2020/04/24 Python
如何基于windows实现python定时爬虫
2020/05/01 Python
Python键鼠操作自动化库PyAutoGUI简介(小结)
2020/05/17 Python
一道SQL存储过程面试题
2016/10/07 面试题
秋季运动会加油稿200字
2014/01/11 职场文书
商务英语专业求职信
2014/06/26 职场文书
副检察长四风问题对照检查材料思想汇报
2014/10/07 职场文书
大学生暑期社会实践证明范本
2014/10/24 职场文书
学校端午节活动总结
2015/02/11 职场文书
生产设备维护保养制度
2015/08/06 职场文书
2019年家电促销广告语集锦
2019/10/21 职场文书
Mac环境Nginx配置和访问本地静态资源的实现
2021/03/31 Servers
django注册用邮箱发送验证码的实现
2021/04/18 Python