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操作数据库之sqlite3打开数据库、删除、修改示例
Mar 13 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
Jun 16 Python
python3实现SMTP发送邮件详细教程
Jun 19 Python
python 删除字符串中连续多个空格并保留一个的方法
Dec 22 Python
对Python信号处理模块signal详解
Jan 09 Python
Python代码生成视频的缩略图的实例讲解
Dec 22 Python
Python数据结构dict常用操作代码实例
Mar 12 Python
matplotlib 对坐标的控制,加图例注释的操作
Apr 17 Python
Python3基于print打印带颜色字符串
Jul 06 Python
Python selenium如何打包静态网页并下载
Aug 12 Python
pandas使用函数批量处理数据(map、apply、applymap)
Nov 27 Python
python代码实现扫码关注公众号登录的实战
Nov 01 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命名空间(Namespace)简明教程
2014/06/11 PHP
php中smarty区域循环的方法
2015/06/11 PHP
PHP实现补齐关闭的HTML标签
2016/03/22 PHP
微信支付开发发货通知实例
2016/07/12 PHP
PHP图片水印类的封装
2017/07/06 PHP
JS判断是否为数字,是否为整数,是否为浮点数的代码
2010/04/24 Javascript
js鼠标滑轮滚动事件绑定的简单实例(兼容主流浏览器)
2014/01/14 Javascript
深入解析JavaScript编程中的this关键字使用
2015/11/09 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
jquery实现全选、全不选以及单选功能
2017/03/23 jQuery
easyui下拉框动态级联加载的示例代码
2017/11/29 Javascript
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
2018/10/12 Javascript
vue 使用element-ui中的Notification自定义按钮并实现关闭功能及如何处理多个通知
2019/08/17 Javascript
js实现计时器秒表功能
2019/12/16 Javascript
最全vue的vue-amap使用高德地图插件画多边形范围的示例代码
2020/07/17 Javascript
typescript配置alias的详细步骤
2020/08/12 Javascript
Django中使用Celery的教程详解
2018/08/24 Python
python实现按行分割文件
2019/07/22 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
2020/02/18 Python
Python reversed函数及使用方法解析
2020/03/17 Python
使用Python文件读写,自定义分隔符(custom delimiter)
2020/07/05 Python
python--shutil移动文件到另一个路径的操作
2020/07/13 Python
Python 转移文件至云对象存储的方法
2021/02/07 Python
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
如何用SQL语句进行模糊查找
2015/09/25 面试题
精选干货:Java精选笔试题附答案
2014/01/18 面试题
市场总监岗位职责
2015/02/11 职场文书
匿名信格式范文
2015/05/27 职场文书
健康证明
2015/06/19 职场文书
蓝天保卫战收官在即 :15行业将开展环保分级评价
2019/07/19 职场文书
导游词之镜泊湖
2019/12/09 职场文书
CSS3中Animation实现简单的手指点击动画的示例
2021/07/15 HTML / CSS
MySQL RC事务隔离的实现
2022/03/31 MySQL
面试官问我Mysql的存储引擎了解多少
2022/08/05 MySQL
css清除浮动clearfix:after的用法详解(附完整代码)
2023/05/21 HTML / CSS