作者 |  梁云1991

来源 | Python与算法之美(ID:Python_Ai_Road)

有时候我们会听到Python里所谓的鸭子类型和猴子补丁的说法,乍一听还以为是来到了动物园,Python这只大蟒蛇还可以和鸭子和猴子一起玩耍?

非也非也,鸭子类型和猴子补丁实际上是两个生动有趣的比喻,用来说明Python的动态特性。

鸭子类型?(duck type) 是对Python中数据类型本质上是由属性和行为来定义的一种解读。

猴子补丁?(monkey patching)是对Python中类和模块可以在外部被动态修改这种特性的一个比喻。

让我们来一探究竟吧!

一、鸭子类型


鸭子类型是对Python中数据类型本质上是由属性和行为来定义的一种解读。

Python是一种动态语言,不像Java和C++这种强类型语言,Python里实际上没有严格的类型检查。

只要某个对象具有鸭子的方法,可以像鸭子那样走路和嘎嘎叫,那么它就可以被其它函数当做鸭子一样调用。

# 这是一个鸭子(Duck)类
class Duck: def __init__(self,name):    self.name = name   def swim(self): print("A duck named " + self.name+" is swimming...")  def call(self): print("gay...gay...gay...")   # 这是一个鹅(Goose)类
class Goose:    def __init__(self,name):    self.name = name   def swim(self): print("A goose named " + self.name+" is swimming...") def call(self): print("goo...goo...goo...")   # duckshow这个函数设计的本意是需要传入一个Duck对象作为参数的。
def duckshow(duck): duck.swim() duck.call() yaya = Duck("yaya")
ee = Goose("ee") # 但由于Python是动态语言,其数据类型属于鸭子类型,没有严格类型检查,
# Goose这个类具有和Duck这个类相同的方法,
# ee这只鹅划起水来像只鸭子,叫起来也像一只鸭子,
# 所以duckshow这个函数也可以对ee进行作用。 duckshow(yaya)
duckshow(ee)    

输出结果如下:

二、猴子补丁

猴子补丁是对Python中模块和类可以在外部被动态修改这种特性的一个比喻。

为什么叫做猴子补丁呢?在模块和类的外部对模块和类进行修改是一种非常耍赖的做法,会破坏代码的封装结构,这种事情大概只有淘气的猴子喜欢去做,因此形象地称之为猴子补丁。

# 定义一个Dog类
class Dog:  def __init__(self,name,age):    self.name = name   self.age = age def sleep(self):    print("Zzz...Zzz..Zzz...")    # 在类的外部给Dog这个类添加猴子补丁
def speak(self):    print("I think myself a hero and very handsome!") Dog.speak = speak
Dog.home = "Earth"   # 与类的内部定义的属性和方法无差异
snoopy = Dog("snoopy",3)
snoopy.sleep()
snoopy.speak()
print(snoopy.home)  

输出结果如下:

br

对于库中已经定义好的类,给它们添加猴子补丁有时候会非常方便,相当于可以自由地在外面做扩展,又不用修改源文件。

import numpy as np
import pandas as pd df = pd.DataFrame(np.random.randint(1,10,size=(5,5)), columns = list("abcde"))
#df.info()
#DataFrame自带方法info打印信息太多,展示不直观。
#给DataFrame定义一个猴子补丁方法memory简洁展示其内存消耗。   def memory(self):   mem = self.__sizeof__()    if mem<1024: return("%s B"%mem)    elif mem<1024*1024:  return("%s KB"%mem/1024)  elif mem<1024**3:    return("%s MB"%mem/1024**2)   else:   return("%s GB"%mem/1024**3)   pd.DataFrame.memory = memory   print(df.memory())

输出结果如下:

280 B
br

这就是Python里的鸭子类型和猴子补丁的一个简单介绍,你耍明白了吗???????

推荐阅读

  • 开源之战

  • 谁偷偷删了你的微信?别慌!Python帮你都揪出来了

  • 吐血整理!140种Python标准库、第三方库和外部工具都有了

  • 如何用爬虫技术帮助孩子秒到心仪的幼儿园(基础篇)

  • Python传奇:30年崛起之路

  • 干货 | Python后台开发的高并发场景优化解决方案

  • 2019年最新华为、BAT、美团、头条、滴滴面试题目及答案汇总

  • 阿里巴巴杨群:高并发场景下Python的性能挑战

你点的每个“在看”,我都认真当成了喜欢

你知道什么是Python里的鸭子类型和猴子补丁吗?相关推荐

  1. python鸭子类型_你知道什么是Python里的鸭子类型和猴子补丁吗?

    有时候我们会听到Python里所谓的鸭子类型和猴子补丁的说法,乍一听还以为是来到了动物园,Python这只大蟒蛇还可以和鸭子和猴子一起玩耍? 非也非也,鸭子类型和猴子补丁实际上是两个生动有趣的比喻,用 ...

  2. Python学习笔记——鸭子类型(duck typing)

    前言 在实习期间,由于工作需要首次接触了Python这门语言,由于学习和使用的时间非常短,所以当时认为,作为一门解释性语言,在做Web开发方面,Python和PHP的差别不大,甚至在一些应用场景上没有 ...

  3. python中的鸭子类型

    浅层理解 走路像鸭子,说话像鸭子,它就是鸭子 深层理解 指的是面向对中,子类不需要显示的继承某个类,只要有某个的方法和属性,那我就属于这个类 编程语言中的鸭子类型说明 假设有个鸭子类Duck类,有两个 ...

  4. Python多态、鸭子类型

    一.多态 多态指的是一类事物有多种形态. 动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 @abc.ab ...

  5. python多态和鸭子类型

    概述 python是一门解释语言,但是同java等静态语言一样,是可以通过继承的方式实现多态.而且python还有一个自己的特殊实现多态的方法,就是通过鸭子类型,来实现多态. 继承多态 通过严格的继承 ...

  6. Python多态与鸭子类型

    学习到多态的时候,不确定自己是否完全理解了python的多态,于是Google观看了众多资料和文献,发现很多编程大佬讲得过于抽象,不便于新手理解,这违背了python的初衷:简单. 所以我在此用通俗一 ...

  7. python 多态 协议 鸭子类型

    接口(python 中的协议)的多种不同的实现方式即为多态.多态的作用,就是为了类在继承和派生的时候,保证使用"家谱"中任一类的实例的某一属性时的正确调用. from abc im ...

  8. python什么是鸭子类型

    一.鸭子类型 鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定 "当看到一 ...

  9. python读取数据库数据类型有哪些_数据库varchar 相当于python里的哪个类型

    展开全部 MySQL数据库的varchar类型数据在Python中是str类型.#coding=utf-8 import MySQLdb conn= MySQLdb.connect( host='19 ...

最新文章

  1. CSV-03- csv 读写框架支持数组、Map、Collection 等常见集合
  2. 对《Python核心编程》中“第一个Python程序”的改进
  3. cacti系统性能监控(CENTOS/UBUNTU)
  4. HDOJ2021 ( 发工资咯:) ) 【水题】
  5. jitpack第三方依赖库使用
  6. Android生成签名文件对应用签名 Android签名作用
  7. spyder的变量窗口显示不全
  8. 句法结构可视化工具(成分句法)
  9. Javakeytool生成RSA密钥
  10. python国际象棋小游戏代码_用Python编写一个国际象棋AI程序
  11. 终于知道什么叫BSS段
  12. 论文在线翻译神器-唐帕翻译
  13. Python 如何反方向迭代一个序列
  14. 专科计算机课程作业2理解题,计算机第二模块练习题
  15. 人人都说的SaaS,你真的了解它吗?
  16. 腾讯企业邮箱收费标准多少钱一年 腾讯企业邮箱价格表
  17. 收购快钱做线下支付,京东数科与蚂蚁终有一战?
  18. Nachos5.0 java版本前三个proj设计报告
  19. NextCloud安装配置小白教程~
  20. C++11特性——右值引用

热门文章

  1. 吃鸡信号枪服务器,绝地求生八人组队新模式介绍,信号枪正式上线服务器!
  2. 悟空问答下线,知乎十周年庆?你怎么看待这起冤家事件?
  3. 再说曾头市史文恭只 水浒
  4. java多线程事务处理
  5. 一位人事经理眼中的国人劣根性
  6. 全国计算机三级网络工程技术复习笔记3
  7. css3音乐播放动画,css3动画应用-音乐唱片旋转播放特效
  8. adb连接夜神模拟器出现error: cannot connect to daemon无法连接到守护程序
  9. 成都盛铭轩:产品描述怎么写
  10. 制作一个二维码,扫描访问网页