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 相关文章推荐
Django自定义用户认证示例详解
Mar 14 Python
利用Python如何批量更新服务器文件
Jul 29 Python
Python设计模式之策略模式实例详解
Jan 21 Python
Python基础之函数的定义与使用示例
Mar 23 Python
python删除文件夹下相同文件和无法打开的图片
Jul 16 Python
Python assert语句的简单使用示例
Jul 28 Python
在PyTorch中Tensor的查找和筛选例子
Aug 18 Python
python二维键值数组生成转json的例子
Dec 06 Python
Python单元测试模块doctest的具体使用
Feb 10 Python
Python正则re模块使用步骤及原理解析
Aug 18 Python
用python实现一个简单的验证码
Dec 09 Python
python中编写函数并调用的知识点总结
Jan 13 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 伪静态技术原理以及突破原理实现介绍
2013/07/12 PHP
laravel数据库查询结果自动转数组修改实例
2021/02/27 PHP
jquery实现文本框鼠标右击无效以及不能输入的代码
2010/11/05 Javascript
jquery淡化版banner异步图片文字效果切换图片特效
2014/04/08 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
node.js中的http.response.writeHead方法使用说明
2014/12/14 Javascript
JavaScript截取指定长度字符串点击可以展开全部代码
2015/12/04 Javascript
js省市联动效果完整实例代码
2015/12/09 Javascript
js中利用tagname和id获取元素的方法
2016/01/03 Javascript
jQuery插入节点和移动节点用法示例(insertAfter、insertBefore方法)
2016/09/08 Javascript
layui导航栏实现代码
2017/05/19 Javascript
jQuery 实时保存页面动态添加的数据的示例
2017/08/14 jQuery
详解node child_process模块学习笔记
2018/01/24 Javascript
webpack之devtool详解
2018/02/10 Javascript
详解Vue单元测试case写法
2018/05/24 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
2020/03/06 Javascript
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
Python实现获取某天是某个月中的第几周
2015/02/11 Python
python避免死锁方法实例分析
2015/06/04 Python
python集合比较(交集,并集,差集)方法详解
2018/09/13 Python
详解python多线程之间的同步(一)
2019/04/03 Python
python爬虫 2019中国好声音评论爬取过程解析
2019/08/26 Python
探究 canvas 绘图中撤销(undo)功能的实现方式详解
2018/05/17 HTML / CSS
英国鞋类及配饰零售商:Kurt Geiger
2017/02/04 全球购物
聚网科技C++面试笔试题
2015/09/01 面试题
存储过程的优点有哪些
2012/09/27 面试题
国际商务专业学生个人的自我评价
2013/09/28 职场文书
《狮子和兔子》教学反思
2014/03/02 职场文书
房产继承公证书
2014/04/09 职场文书
环保建议书300字
2014/05/14 职场文书
外贸采购员岗位职责
2015/04/03 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
2017大学生寒假社会实践心得体会
2016/01/14 职场文书
详解MySQL事务的隔离级别与MVCC
2021/04/22 MySQL
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android