集团主站
欢迎来到成都达内官方网站!达内—美国上市公司 亿元级外企IT培训企业!
成都it培训哪家好
成都it培训哪家好
全国服务监督电话:15023458194  |   联系客服   |
当前位置:主页 > 培训课程 >

Python中的协议 、鸭子类型 、 抽象基类 、混入类

发布者: 成都达内     浏览次数:

在python中,协议是一个或一组方法。例如,Python 的序列协议包含 len 和 getitem 两个方法, 上下文管理器协议包含 enter 和 exit 两个方法(前者参见文章 《一文读懂python可迭代对象、迭代器...

  Python中的协议 、鸭子类型 、 抽象基类 、混入类

  本篇文章探讨一下python中的几个概念:协议 、鸭子类型 、 抽象基类 、混入类。

  一、协议

  在python中,协议是一个或一组方法。例如,Python 的序列协议包含 len 和 getitem 两个方法, 上下文管理器协议包含 enter 和 exit 两个方法(前者参见文章 《一文读懂python可迭代对象、迭代器和生成器》,后者参见文章《python中的上下文管理器和你所不了解的with》),此处不再赘述。

  二、鸭子类型(duck typing)

  多态的一种形式,在这种形式中,对象的类型无关紧要,只要实现了特定的协议即可。

  举一个之前文章中的例子:

  示例1

  class Eg1: def __init__(self, text): self.text = text self.sub_text = text.split(' ') def __getitem__(self, index): return self.sub_text[index] def __len__(self): return len(self.sub_text)o1 = Eg1('Hello, the wonderful new world!')print('长度:', len(o1))for i in o1: print(i)

  输出:

  长度: 5Hello,thewonderfulnewworld!

  示例1 中Eg1类 实现了 len 和 getitem两个方法,也就是实现了序列协议,那么它的表现就和序列类似。通过输出结果就能看出,Eg1的对象可以计算长度,也可以循环处理,这和正常的序列没什么不同。因此我们可以把Eg1称为一个鸭子类型,即 只关注它是否实现了相应的协议,不关注它的类型。

  三、抽象基类

  抽象基类就是定义各种方法而不做具体实现的类,任何继承自抽象基类的类必须实现这些方法,否则无法实例化。

  那么抽象基类这样实现的目的是什么呢? 假设我们在写一个关于动物的代码。涉及到的动物有鸟,狗,牛。首先鸟,狗,牛都是属于动物的。既然是动物那么肯定需要吃饭,发出声音。但是具体到鸟,狗,牛来说吃饭和声音肯定是不同的。需要具体去实现鸟,狗,牛吃饭和声音的代码。概括一下抽象基类的作用:定义一些共同事物的规则和行为。

  示例2

  import abcclass Animal(abc.ABC): @abc.abstractmethod def eat(self):"""吃的动作""" @abc.abstractmethod def voice(self):"""叫的动作"""class Dog(Animal): def eat(self): print('Dog eating....') def voice(self): print('wow....')class Bird(Animal): def eat(self): print('Bird eating....') def voice(self): print('jiji....')d = Dog()d.eat()d.voice()b = Bird()b.eat()b.voice()

  输出:

  Dog eating....wow....Bird eating....jiji....

  示例2中定义了一个抽象基类 Animal,它包含两个抽象方法eat和voice,Dog和Bird都继承了Animal,并各自实现了具体的eat和voice方法。Dog和Bird在实例化之后调用相同的方法,但是却有不同的输出,这就是最简单的抽象基类的用法。

  注意,自己定义的抽象基类要继承 abc.ABC(abc.ABC 是 Python 3.4 新增的类,python2的语法不是这样的)。抽象方法使用 @abstractmethod 装饰器标记,而且定义体中通常只有文档字符串。

  除了继承,还有一种方法可以将类和抽象基类关联起来: 示例3,在示例2后面添加代码:

  @Animal.registerclass Cat(Animal): def eat(self): print('Cat eating....') def voice(self): print('miao....')print(issubclass(Cat, Animal))

  输出:

  True

  这种通过注册和抽象基类关联起来的类叫做虚拟子类,虚拟子类不会继承注册的抽象基类,而且任何时候都不会检查它是否符合抽象基类的接口,即便在实例化时也不会检查。为了避免运行时错误,虚拟子类要实现所需的全部方法。

  抽象基类并不常用,但是在阅读源码的时候可能会遇到,因此还是要了解一下。

  四、混入类(mixin class)

  混入类是为代码重用而生的。从概念上讲,混入不定义新类型,只是打包方法,便于重用。混入类应该提供某方面的特定行为,只实现少量关系非常紧密的方法并且混入类绝对不能实例化。

  在 Python 中没有把类声明为混入的正规方式,所以强烈推荐在名称中加入 ...Mixin 后缀。Django在这方面做的很好,举一个例子, ListView主要用于从数据库中获取多条记录,它的继承关系如下:

  成都Python培训

  整个体系非常清晰,各个类的职责也非常明确,且类的职责从命名就可以读出。例如 ContextMixin 及其子类负责获取渲染模板所需的模板变量;MultipleObjectMixin 负责从数据库获取模型对应的多条数据;View 负责处理 HTTP 请求(如 get 请求,post 请求);TemplateResponseMixin 及其子类负责渲染模板。各个类组合在一起就构成了功能完整的 ListView。由此看出Django设计者充分采纳了一个类只负责一件事的设计理念(即单一责任原则),而且命名也是遵循一套统一的规范(...Mixin 后缀)。

  好了,了解了这些概念对于python的使用和源码的阅读是非常有用的。希望能对你有帮助!

  现在人工智能爆发,Python是一门脚本语言,它更适合去做人工智能这个领域,在人工智能上使用Python比其他编程语言有更大的优势。

(责任编辑:范老师)
最新开班
  • 成都Java培训班
    免费试听名额发放中...
  • 成都C++培训班
    免费试听名额发放中...
  • 成都PHP培训班
    免费试听名额发放中...
  • 成都网络工程培训班
    免费试听名额发放中...
  • 成都Unity3D培训班
    免费试听名额发放中...
  • 成都大数据培训班
    免费试听名额发放中...
  • 成都uid培训班
    免费试听名额发放中...
  • 成都会计培训班
    免费试听名额发放中...
  • 成都Python培训班
    免费试听名额发放中...
  • 成都嵌入式培训班
    免费试听名额发放中...
  • 成都web培训班
    免费试听名额发放中...
  • 成都软件测试培训班
    免费试听名额发放中...
在线留言
提交

校区地址:绵阳市涪城区临园路东段68号富临大都会7栋3单元9层12号

联系电话:15023458194

公交路线:富乐路口凯德广场(10路;29路;3路;15路;11路;15a路;71路)

校区地址:成都市锦江区东大街紫东楼段35号明宇金融广场19楼1903室

联系电话:15023458194

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:高新区奥克斯广场B座17楼08号

联系电话:15023458194

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

校区地址:成都市锦江区东大街芷泉段229号东方广场C座3楼

联系电话:15023458194

公交路线:芷泉街(188路;115路;515路;236路;505路;501路;84路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市武侯区佳灵路3号红牌楼广场2号写字楼6楼14号

联系电话:15023458194

公交路线:红牌楼东(11路;92路;100路;111路;139路;g28路;快速公交K1/K2) 地铁路线:红牌楼站(地铁3号线)

校区地址:成都市锦江区红星路二段70号四川日报大厦502-2

联系电话:15023458194

公交路线:市二医院站(6路;49路;102路;5路;37路;g92路;) 地铁路线:地铁市二医院(地铁3号线)

校区地址:成都市锦江区东大街紫东段35号明宇广场2306

联系电话:15023458194

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市高新区孵化园9号园区E座7楼

联系电话:15023458194

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

校区地址:成都市成华区建设路10号万科钻石广场B座5楼

联系电话:15023458194

公交路线:建设路中(6路;14路;42路;72路;76路;1010路;)

校区地址:成都市高新区奥克斯广场B座1708

联系电话:15023458194

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

了解达内动态
关注成都达内教育公众号

首页 | 关于达内 | 课程中心 | 专家师资 | 视频教程 | 学员空间 | 校企合作 | 新闻资讯 | 就业指导 | 网站地图

20016-2025 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56