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服务器与android客户端socket通信实例
Nov 12 Python
Python中字典的基本知识初步介绍
May 21 Python
Python模块搜索概念介绍及模块安装方法介绍
Jun 03 Python
Python使用PyCrypto实现AES加密功能示例
May 22 Python
Python实现桶排序与快速排序算法结合应用示例
Nov 22 Python
vue.js实现输入框输入值内容实时响应变化示例
Jul 07 Python
浅谈django的render函数的参数问题
Oct 16 Python
Python Pandas 箱线图的实现
Jul 23 Python
Python如何使用k-means方法将列表中相似的句子归类
Aug 08 Python
详解Anaconda 的安装教程
Sep 23 Python
python中round函数保留两位小数的方法
Dec 04 Python
pytorch 实现在测试的时候启用dropout
May 27 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实现在服务器上创建目录的方法
2015/03/16 PHP
PHP 芝麻信用接入的注意事项
2016/12/01 PHP
yii2.0框架实现上传excel文件后导入到数据库的方法示例
2020/04/13 PHP
javascript parseInt与Number函数的区别
2010/01/21 Javascript
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
jquery获取下拉列表的值为null的解决方法
2011/03/18 Javascript
jquery 触发a链接点击事件解决方案
2013/05/02 Javascript
Js点击弹出下拉菜单效果实例
2013/08/12 Javascript
浏览器缩放检测的js代码
2014/09/28 Javascript
js结合正则实现国内手机号段校验
2015/06/19 Javascript
基于jQuery实现搜索关键字自动匹配功能
2020/03/26 Javascript
AngularJS  ng-table插件设置排序
2016/09/21 Javascript
原生js实现简单的焦点图效果实例
2017/12/14 Javascript
vue.js将时间戳转化为日期格式的实现代码
2018/06/05 Javascript
Vue实现指令式动态追加小球动画组件的步骤
2020/12/18 Vue.js
[01:37]全新的一集《真视界》——TI7总决赛
2017/09/21 DOTA
[04:09]2018年度DOTA2社区贡献奖-完美盛典
2018/12/16 DOTA
[51:53]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第二场 11.01
2020/11/02 DOTA
wxPython 入门教程
2008/10/07 Python
Python使用random和tertools模块解一些经典概率问题
2015/01/28 Python
Python3导入自定义模块的三种方法详解
2018/04/13 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
2018/12/10 Python
python进行文件对比的方法
2018/12/24 Python
python实现列表中最大最小值输出的示例
2019/07/09 Python
django的auth认证,authenticate和装饰器功能详解
2019/07/25 Python
python3实现mysql导出excel的方法
2019/07/31 Python
在Python中等距取出一个数组其中n个数的实现方式
2019/11/27 Python
基于python实现FTP文件上传与下载操作(ftp&sftp协议)
2020/04/01 Python
Melissa香港官网:MDreams
2016/07/01 全球购物
Melissa鞋马来西亚官方网站:MDreams马来西亚
2018/04/05 全球购物
ONLY瑞典官网:世界知名服装品牌
2018/06/19 全球购物
大龄毕业生求职别忘职业规划
2014/03/11 职场文书
关于安全演讲稿
2014/05/09 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
2015年信贷员工作总结
2015/04/28 职场文书
SQL SERVER中的流程控制语句
2022/05/25 SQL Server