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处理python编码问题
Mar 13 Python
Python中的lstrip()方法使用简介
May 19 Python
python开发之文件操作用法实例
Nov 13 Python
Tensorflow之Saver的用法详解
Apr 23 Python
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
May 24 Python
Python中logging.NullHandler 的使用教程
Nov 29 Python
Appium Python自动化测试之环境搭建的步骤
Jan 23 Python
python区块及区块链的开发详解
Jul 03 Python
Python捕获异常堆栈信息的几种方法(小结)
May 18 Python
浅谈TensorFlow中读取图像数据的三种方式
Jun 30 Python
matplotlib 多个图像共用一个colorbar的实现示例
Sep 10 Python
Python logging自定义字段输出及打印颜色
Nov 30 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 empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
PHP使用CURL模拟登录的方法
2015/07/08 PHP
深入理解PHP变量的值类型和引用类型
2015/10/21 PHP
Zend Framework常用校验器详解
2016/12/09 PHP
PHP面向对象程序设计__tostring()和__invoke()用法分析
2019/06/12 PHP
thinkPHP和onethink微信支付插件分享
2019/08/11 PHP
laravel5.2表单验证,并显示错误信息的实例
2019/09/29 PHP
jQuery的一些特性和用法整理小结
2010/01/13 Javascript
jQuery内容过滤选择器用法分析
2015/02/10 Javascript
jQuery检查事件是否触发的方法
2015/06/26 Javascript
jquery ztree实现树的搜索功能
2016/02/25 Javascript
基于Javascript实现二级联动菜单效果
2016/03/04 Javascript
在vue中实现echarts随窗体变化
2020/07/27 Javascript
js+canvas实现刮刮奖功能
2020/09/13 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
2020/10/22 Javascript
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
Python爬虫实现百度图片自动下载
2018/02/04 Python
Python中new方法的详解
2019/01/15 Python
django如何通过类视图使用装饰器
2019/07/24 Python
Django实现跨域请求过程详解
2019/07/25 Python
完美解决Django2.0中models下的ForeignKey()问题
2020/05/19 Python
python 实现围棋游戏(纯tkinter gui)
2020/11/13 Python
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
西班牙灯具网上商店:Lampara.es
2018/06/05 全球购物
英国时尚和家居用品零售商:Matalan
2021/02/28 全球购物
个人求职简历的自我评价范文
2013/10/09 职场文书
文史专业毕业生自荐信
2013/11/17 职场文书
毕业研究生的自我鉴定
2013/11/30 职场文书
部队学习十八大感言
2014/01/11 职场文书
销售主管岗位职责
2014/02/08 职场文书
企业与个人合作经营协议书
2014/11/01 职场文书
2015元旦家电促销活动策划方案
2014/12/09 职场文书
敬业奉献模范事迹材料
2014/12/24 职场文书
python 实现体质指数BMI计算
2021/05/26 Python
MySQL表锁、行锁、排它锁及共享锁的使用详解
2022/04/02 MySQL
《勇者辞职不干了》ED主题曲无字幕动画MV公开
2022/04/13 日漫