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配置grpc环境
Jan 01 Python
Python3.5面向对象与继承图文实例详解
Apr 24 Python
使用python socket分发大文件的实现方法
Jul 08 Python
django-filter和普通查询的例子
Aug 12 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
Feb 07 Python
Python调用.net动态库实现过程解析
Jun 05 Python
利用PyTorch实现VGG16教程
Jun 24 Python
python绘制分布折线图的示例
Sep 24 Python
基于Python实现全自动下载抖音视频
Nov 06 Python
基于python实现监听Rabbitmq系统日志代码示例
Nov 28 Python
用Python自动清理系统垃圾的实现
Jan 18 Python
python调试工具Birdseye的使用教程
May 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
用PHP发电子邮件
2006/10/09 PHP
PHP中通过加号合并数组的一个简单方法分享
2011/01/27 PHP
php开启安全模式后禁用的函数集合
2011/06/26 PHP
php单例模式实现方法分析
2015/03/14 PHP
解决Laravel 使用insert插入数据,字段created_at为0000的问题
2019/10/11 PHP
JavaScript延迟加载
2021/03/09 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
jQuery实现跨域
2015/02/03 Javascript
JavaScript中用toString()方法返回时间为字符串
2015/06/12 Javascript
浅析JS异步加载进度条
2016/05/05 Javascript
微信小程序  Mustache语法详细介绍
2016/10/27 Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
2016/12/27 Javascript
AngularJS实现页面定时刷新
2017/03/14 Javascript
用js将long型数据转换成date型或datetime型的实例
2017/07/03 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
2017/12/09 Javascript
如何解决React官方脚手架不支持Less的问题(小结)
2018/09/12 Javascript
小程序scroll-view组件实现滚动的示例代码
2018/09/20 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
Vue3.0中的monorepo管理模式的实现
2019/10/14 Javascript
解决vue项目 build之后资源文件找不到的问题
2020/09/12 Javascript
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
Django跨域请求问题的解决方法示例
2018/06/16 Python
在pycharm上mongodb配置及可视化设置方法
2018/11/30 Python
Python Print实现在输出中插入变量的例子
2019/12/25 Python
python 实现一个简单的线性回归案例
2020/12/17 Python
详解移动端html5页面长按实现高亮全选文本内容的兼容解决方案
2016/12/03 HTML / CSS
优秀研究生自我鉴定
2013/12/04 职场文书
迷你西餐厅创业计划书范文
2013/12/31 职场文书
大学军训感言1000字
2014/02/25 职场文书
商业项目策划方案
2014/06/05 职场文书
2014领导干部学习焦裕禄同志先进事迹思想汇报
2014/09/19 职场文书
工程技术员岗位职责
2015/04/11 职场文书
“学党章、守党纪、讲党规”学习心得体会
2016/01/14 职场文书
导游词之任弼时故居
2020/01/07 职场文书
Python深度学习之Pytorch初步使用
2021/05/20 Python
如何将JavaScript将数组转为树形结构
2021/06/02 Javascript