点击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

穷则变,变则通,通则久。

众所周知,python是一门编程语言,它可以做的东西很多,爬虫、人工智能、自动化测试、数据分析等等。而鸭子是一种动物,它可以做的东西也很多,啤酒鸭、香烤鸭、盐水鸭、土豆焖鸭等等。按理说这两个对应着不同人体器官的东西应该是扯不上关系的。

但是,偏偏就有辣莫一个人,美国诗人詹姆斯·惠特科姆·莱利,在17世纪时写下了一句诗:

「When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.」

就是这短短的一句诗,让这两者扯上了神奇的关系,关键人们还为这种关系取了个名字 -- 鸭子类型。从此python和鸭子就成就了一段佳话啊呸,那这鸭子类型究竟是怎么回事呢?且往下看~

思考一个场景

加入在你拥有一款内容聚合应用,这款应用每天会从各个门户网站采集一些文章回来,并且分发至应用里面的各个频道。

这个时候我们可以将分发文章这个功能简单的抽象为一个distribute函数,该函数由两个参数构成,待分发文章article,分发频道channel

同时为了保证文章更符合频道的内容范围和调性,在每篇文章分发至频道时,最好都对文章做一些准入校验,于是我们初步封装出以下函数:

def distribute(article, channel):# 文章准入判断# 政务频道的文章标题不能出现‘震惊’字眼if channel.name == 'politics' and article.title.find('震惊') >= 0:return False# 娱乐频道不允许a,b这两个作者的文章elif channel.name == 'entertainment' and article.author in ['a','b']:return False# some elif here...# 将文章与频道的绑定关系写进数据库return bind_relation(article, channel)

上面的函数确实能够实现我们想要的功能了,但是存在一个显而易见的问题:如果我们每增加一条准入规则,就需要改动一次distribute函数,这样频繁地对一个函数动刀显然不是一个好的做法。

我们希望这个函数是一个更抽象的公共函数,他不需要被过多的改动,于是我们做一点改进,变成下面的函数:

def distribute(article, channel):# 文章准入判断can_push = channel.check(article)# 将文章与频道的绑定关系写进数据库if can_push:return bind_relation(article, channel)return False

将校验频道准入规则的这个功能用频道类自己实现的check方法封装起来,这样每当有一个新的频道需要创建,或者旧频道需要更改校验规则,则只需要负责维护各自频道类的check方法就好了。

distribute函数作为一个更高层级的存在则不会被影响到。

class Article:def __init__(self, title, author):self.title = titleself.author = authorclass EntertainmentChannel:def __init__(self)self.name = 'entertainment'def check(article):if article.author in ['a','b']:return Falsereturn Trueclass PoliticsChannel:def __init__(self)self.name = 'politics'def check(article):if article.title.find('震惊') >= 0:return Falsereturn Truearitcle_a = Article('震惊!大笑1小时寿命减少60分钟!', 'a')
aritcle_b = Article('战胜恐惧最好的办法?', 'b')politics_channel = PoliticsChannel()
entertainment_channel = EntertainmentChannel()distribute(aritcle_a, politics_channel)  # Fasle
distribute(aritcle_b, entertainment_channel)  # Fasle

多态

上面对于distribute函数的改造结果,其实很类似于面向对象三大特征之一 —— 多态 的应用。

简单解释起来,多态就是同一操作(方法)被作用于不同的对象时,可以有不同的解释,产生不同的执行结果。

例如上面的check方法,当它由EntertainmentChannel类实例调用时,检查的是文章标题不能包含“震惊”字眼;由PoliticsChannel类实例调用时,检查的是文章作者不能是’a'和‘b’。

多态在静态语言如 Java 中,通常通过子类继承父类,然后子类重写父类中的某些方法来实现多态。但是在python中,不需要搞子承父业这一套,只需要在不同的类里面实现好名字相同的方法,即可在运行时表现出多态

只不过,这种特征在python中一般不叫多态,而是我们前面提到的——鸭子类型

鸭子类型

鸭子类型的名字来源和具体应用场景前面已经描述过了,而关于鸭子类型的定义,网上出现最多的就是对文章开头那句英文诗句的翻译:

如果一只鸟走起来像鸭子,发出的声音像鸭子,游起来像鸭子,那么它就是一只鸭子

这句话重点在于引导我们只关注事物的行为,而不是关注事物本身和它的表现。再看一个帮助理解的栗子????:

class Duck:def sound(self):print('quack')def walk(self):print('da da da')class Dog:def sound(self):print('wang')def walk(self):print('tita tita tita')def walk_and_sound(animal):animal.walk()animal.sound()dog = Dog()
duck = Duck()walk_and_sound(dog) # tita tita tita wang
walk_and_sound(duck) # da da da quack

就好像一只狗会走,会叫;鸭子也会走,会叫。狗有很多行为都跟鸭子相似,他们做的动作是一样的,只是表现出来不一样。

我们关注的是类有什么方法,能做什么,而不是类是怎么定义的,表现出来是怎么样的。这个正是鸭子类型想表达的思想。

鸭子类型的思想

总结

  • 鸭子类型是python中多态的一种实现方式。

  • 鸭子类型强调关注事物的行为而不是事物本身和事物的表现,如果某些类都实现了同名方法,那这些类就符合鸭子类型

后记&引用

其实我仔细想了想,如果我早出生几个世纪,在詹姆斯·惠特科姆·莱利写出那句诗之前,喊出 「如果一个四肢动物走起来像狗,叫起来像狗,傻起来像狗,那它就是一只狗」~这样一句话。

是不是现在就不叫鸭子类型而改叫狗子类型呢?唉,又错过了名留千史的机会,还是应了一句老话:出名要趁早啊!

------------------- End -------------------

往期精彩文章推荐:

  • Python环境搭建—安利Python小白的Python和Pycharm安装详细教程

  • 一篇文章教会你理解Scrapy网络爬虫框架的工作原理和数据采集过程

  • 利用Python网络爬虫抓取微信好友的签名及其可视化展示

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Python学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行

/今日留言主题/

随便说一两句吧~~

等等!python和鸭子是什么关系?相关推荐

  1. python 数据分析学什么-学好python和数据分析有什么关系?

    原标题:学好python和数据分析有什么关系? 没有一毛钱关系,可能存在一分钱的关系 先从2则高级数据分析师的招聘看起: 第一个: 任职要求: 1.统计学,数学,计算机等专业本科及以上学历,3~8年或 ...

  2. python叫什么-Python为什么叫爬虫?Python与爬虫有什么关系?

    今天听到有人问:Python为什么叫爬虫?我的脑袋里第一反应不是答案,而是为什么有人会问这个问题,我想大家对Python的概念有点模糊,将Python与爬虫混淆,所以今天我向大家解释一下. 什么是Py ...

  3. python爬虫什么意思-Python为什么叫爬虫?Python与爬虫有什么关系?

    今天听到有人问:Python为什么叫爬虫?我的脑袋里第一反应不是答案,而是为什么有人会问这个问题,我想大家对Python的概念有点模糊,将Python与爬虫混淆,所以今天我向大家解释一下. 什么是Py ...

  4. python中进制转换关系

    python中进制转换关系 标题整数之间的进制转换: hex(16) # 10进制转16进制 print(hex(16) ) >>'0x10' oct(8) # 10进制转8进制 prin ...

  5. Python和人工智能到底啥关系?

    我们经常听到"Python"与"人工智能"这两个词, 也很容易混淆这两个词, 那么Python和人工智能到底什么关系呢? Python人工智能工程师待遇怎么样? ...

  6. 简单分析C之Curl模块同php的curl和python的pycurl模块的关系

    简单分析C之Curl模块同php的curl和python的pycurl模块的关系 简单分析C之Curl模块同php的curl和python的pycurl模块的关系 - CL.TANG - 博客园 简单 ...

  7. python跟人工智能的关系_多迪技术讲师带你了解python和人工智能有什么关系?

    原标题:多迪技术讲师带你了解python和人工智能有什么关系? Python是一种编程语言,而人工智能指的是AI,也就是说,可以用上面的语言来编写人工智能的算法和程序.下面多迪技术讲师告诉你pytho ...

  8. 导出python源码的函数调用关系图的方法

    导出python源码的函数调用关系图的方法 1. pycallgraph+graphviz 2. pyreverse+graphviz 3. pycharm(推荐) 4. starUML 5. Ent ...

  9. python 协程和异步的关系_python协程与异步协程

    在前面几个博客中我们一一对应解决了消费者消费的速度跟不上生产者,浪费我们大量的时间去等待的问题,在这里,针对业务逻辑比较耗时间的问题,我们还有除了多进程之外更优的解决方式,那就是协程和异步协程.在引入 ...

  10. python与鸭子类型

    目录 1.面向对象(OOP)的三大特征 2.静态类型语言和动态类型语言的区别 3.面向接口编程 4.鸭子类型 5.python中的多态 1.面向对象(OOP)的三大特征 (1)面向对象程序设计有三大特 ...

最新文章

  1. 人工智能灵魂注入,燃烧你的卡路里——2018,你AI了吗!?
  2. 近期活动盘点:第一届“数据故事计划”、“新世界,由你造”阿里菜鸟2019实习生招聘...
  3. 四种可能导致数据中心瘫痪的网络攻击
  4. 频频转型的蘑菇街,能讲好直播这个“老故事”吗?
  5. 关注!部分高校公布暑假时间,暑假将弹性调整?
  6. python学生管理系统用类写_python面向对象——学校学生教职工管理系统类的实例...
  7. 三角学——极坐标_2
  8. goland sql 脚本运行_Flink 1.9 实战:使用 SQL 读取 Kafka 并写入 MySQL
  9. 贺建奎给自己做了三次“基因编辑”:想当中国爱因斯坦,却变成生物狂人
  10. iScroll框架的修改
  11. oracle中的代码在那里写,oracle中如何编写树级代码-数据库专栏,ORACLE
  12. SSM项目实战:学生学籍管理系统
  13. Python之字典遍历元素
  14. hive Unexpected column vector type LIST
  15. 云终端服务器属于计算机设备吗,云终端不等于云电脑
  16. Connection terminated as request was larger than XXX
  17. 一场分销裂变活动,不止是发发朋友圈这么简单
  18. 实战丨Web云开发项目—TodoList待办事项
  19. java jws web_java 用jws发布一个简单的webservice
  20. Python实现旋转按钮控制小风扇

热门文章

  1. 从返利网站看如何经营用户
  2. 北京最最最牛的IT公司都在这了 。。。
  3. python+vue+elementui健身房网站管理系统django-pycharm项目
  4. 模仿腾讯QQ的web登陆面板
  5. PID LSim PT3这个仿真模块 S7-1200 S7-1500 CPU下载
  6. MATLAB机器人工作空间三轴机器人scara
  7. Fastadmin中的语言加载机制
  8. delphi技巧总结收集
  9. 【Rust 笔记】08-枚举与模式
  10. 方正飞鸿智能信息平台(FIX ES2007)帮助手册+知识库