iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python中的鸭子类型和猴子补丁怎么使用
  • 793
分享到

Python中的鸭子类型和猴子补丁怎么使用

2023-07-06 04:07:42 793人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

本篇内容主要讲解“python中的鸭子类型和猴子补丁怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中的鸭子类型和猴子补丁怎么使用”吧!鸭子类型引用维基百科中的一段解释:鸭子类

本篇内容主要讲解“python中的鸭子类型和猴子补丁怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习Python中的鸭子类型和猴子补丁怎么使用”吧!

鸭子类型

引用维基百科中的一段解释:

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

更通俗一点的说:

当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。

也就是说,在鸭子类型中,关注点在于对象的行为,能作什么;而不是关注对象所属的类型。

我们看一个例子,更形象地展示一下:

# 这是一个鸭子(Duck)类class Duck:def eat(self):print("A duck is eating...")def walk(self):print("A duck is walking...")# 这是一个狗(Dog)类class Dog:def eat(self):print("A dog is eating...")def walk(self):print("A dog is walking...")def animal(obj):obj.eat()obj.walk()if __name__ == '__main__':animal(Duck())animal(Dog())

程序输出:

A duck is eating...A duck is walking...A dog is eating...A dog is walking...

Python 是一门动态语言,没有严格的类型检查。只要 Duck 和 Dog 分别实现了 eat 和 walk 方法就可以直接调用。

再比如 list.extend() 方法,除了 list 之外,dict 和 tuple 也可以调用,只要它是可迭代的就都可以调用。

看过上例之后,应该对「对象的行为」和「对象所属的类型」有更深的体会了吧。

再扩展一点,其实鸭子类型和接口挺像的,只不过没有显式定义任何接口。

比如用 Go 语言来实现鸭子类型,代码是这样的:

package mainimport "fmt"// 定义接口,包含 Eat 方法type Duck interface { Eat()}// 定义 Cat 结构体,并实现 Eat 方法type Cat struct{}func (c *Cat) Eat() { fmt.Println("cat eat")}// 定义 Dog 结构体,并实现 Eat 方法type Dog struct{}func (d *Dog) Eat() { fmt.Println("dog eat")}func main() { var c Duck = &Cat{} c.Eat() var d Duck = &Dog{} d.Eat() s := []Duck{&Cat{},&Dog{}, } for _, n := range s {n.Eat() }}

通过显式定义一个 Duck 接口,每个结构体实现接口中的方法来实现。

猴子补丁

猴子补丁(Monkey Patch)的名声不太好,因为它会在运行时动态修改模块、类或函数,通常是添加功能或修正缺陷。

猴子补丁在内存中发挥作用,不会修改源码,因此只对当前运行的程序实例有效。

但如果滥用的话,会导致系统难以理解和维护。

主要有两个问题:

  • 补丁会破坏封装,通常与目标紧密耦合,因此很脆弱

  • 打了补丁的两个库可能相互牵绊,因为第二个库可能会撤销第一个库的补丁

所以,它被视为临时的变通方案,不是集成代码的推荐方式。

按照惯例,还是举个例子来说明:

# 定义一个Dog类class Dog:def eat(self):print("A dog is eating ...")# 在类的外部给 Dog 类添加猴子补丁def walk(self):print("A dog is walking ...")Dog.walk = walk# 调用方式与类的内部定义的属性和方法一样dog = Dog()dog.eat()dog.walk()

程序输出:

A dog is eating ...A dog is walking ...

这里相当于在类的外部给 Dog 类增加了一个 walk 方法,而调用方式与类的内部定义的属性和方法一样。

再举一个比较实用的例子,比如我们常用的 JSON 标准库,如果说想用性能更高的 ujson 代替的话,那势必需要将每个文件的引入:

import json

改成:

import ujson as json

如果这样改起来成本就比较高了。这个时候就可以考虑使用猴子补丁,只需要在程序入口加上:

import jsonimport ujsondef monkey_patch_json():json.__name__ = 'ujson'json.dumps = ujson.dumpsjson.loads = ujson.loadsmonkey_patch_json()

这样在以后调用 dumps 和 loads 方法的时候就是调用的 ujson 包,还是很方便的。

到此,相信大家对“Python中的鸭子类型和猴子补丁怎么使用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Python中的鸭子类型和猴子补丁怎么使用

本文链接: https://www.lsjlt.com/news/357800.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python中的鸭子类型和猴子补丁怎么使用
    本篇内容主要讲解“Python中的鸭子类型和猴子补丁怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中的鸭子类型和猴子补丁怎么使用”吧!鸭子类型引用维基百科中的一段解释:鸭子类...
    99+
    2023-07-06
  • 简单聊聊Python中的鸭子类型和猴子补丁
    目录前言鸭子类型猴子补丁总结前言 Python 开发者可能都听说过鸭子类型和猴子补丁这两个词,即使没听过,也大概率写过相关的代码,只不过并不了解其背后的技术要点是这两个词而已。 我最...
    99+
    2024-04-02
  • 怎么理解Python猴子补丁
    这篇文章主要介绍“怎么理解Python猴子补丁”,在日常操作中,相信很多人在怎么理解Python猴子补丁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解Python猴子补丁”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-01
  • Python浅析多态与鸭子类型使用实例
    什么多态:同一事物有多种形态 为何要有多态=》多态会带来什么样的特性,多态性 多态性指的是可以在不考虑对象具体类型的情况下而直接使用对象多态指的是一类事物有多种形态,比如动物有多种形...
    99+
    2024-04-02
  • javascript设计模式中鸭子类型和多态怎么实现
    这篇文章主要介绍“javascript设计模式中鸭子类型和多态怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“javascript设计模式中鸭子类型和多态怎么实现”文章能帮助大家解决问题。1....
    99+
    2023-06-26
  • Python中tqdm的使用和例子
    目录1. tqdm的介绍1.1 tqdm导入2. tqdm.tqdm()对可迭代对象进行封装2.1 语法2.2 例子2.3 带有参数的tqdm.tqdm()2.3.1 例子12.3....
    99+
    2024-04-02
  • python子类在多继承中怎么使用MRO
    本篇内容主要讲解“python子类在多继承中怎么使用MRO”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python子类在多继承中怎么使用MRO”吧!子类在多继承中使用MRO机制在Python中...
    99+
    2023-07-05
  • 怎么在Python中利用Pycharm编写一个猴子摘桃小游戏
    怎么在Python中利用Pycharm编写一个猴子摘桃小游戏?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。源码及注释:import pygamefrom ...
    99+
    2023-06-06
  • 如何在Keras中使用模型的子类化
    在Keras中使用模型的子类化可以通过创建一个继承自tf.keras.Model的子类来实现。以下是一个简单的示例: import ...
    99+
    2024-03-14
    Keras
  • python中Laplacian算子怎么使用
    本篇内容介绍了“python中Laplacian算子怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明Laplacian算子通过对邻...
    99+
    2023-06-20
  • Css中表格和盒子模型怎么用
    这篇文章主要介绍Css中表格和盒子模型怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!表格border-collapse相邻单元格边框处理,合并表格=collapseborder...
    99+
    2024-04-02
  • Python中的else子句怎么用
    这篇文章将为大家详细讲解有关Python中的else子句怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。else子句Python中的else子句不仅能在if语句中使用...
    99+
    2024-04-02
  • HTML中各类型盒子的基线怎么确定
    本篇内容介绍了“HTML中各类型盒子的基线怎么确定”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!   确...
    99+
    2024-04-02
  • JS盒子模型的基本属性怎么使用
    这篇“JS盒子模型的基本属性怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JS盒子...
    99+
    2024-04-02
  • 怎么在python中使用数值类型
    这期内容当中小编将会给大家带来有关怎么在python中使用数值类型,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络...
    99+
    2023-06-14
  • 怎么使用Python中的基础数据类型
    本篇内容介绍了“怎么使用Python中的基础数据类型”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Python中的数据类型Number(数字...
    99+
    2023-06-01
  • Python中的复杂数据类型怎么使用
    这篇文章主要介绍“Python中的复杂数据类型怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中的复杂数据类型怎么使用”文章能帮助大家解决问题。一、序列:序列是基类类型,序列扩展类...
    99+
    2023-06-30
  • 怎么使用Vue3 SFC和TSX方式调用子组件中的函数
    今天小编给大家分享一下怎么使用Vue3 SFC和TSX方式调用子组件中的函数的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-07-04
  • mysql中bit类型怎么赋值和使用
    在 MySQL 中,BIT 类型用于存储位字段值。BIT(n) 表示 n 个位字段值,其中 n 是一个范围从 1 到 64 的整数。...
    99+
    2024-04-09
    mysql
  • Python编程中内置的NotImplemented类型怎么使用
    本篇内容介绍了“Python编程中内置的NotImplemented类型怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、NotIm...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作