iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >怎么理解Python猴子补丁
  • 771
分享到

怎么理解Python猴子补丁

2023-06-01 22:06:49 771人浏览 安东尼

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

摘要

这篇文章主要介绍“怎么理解python猴子补丁”,在日常操作中,相信很多人在怎么理解Python猴子补丁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解Python猴子补丁”的疑惑有所帮助!接下来,请跟

这篇文章主要介绍“怎么理解python猴子补丁”,在日常操作中,相信很多人在怎么理解Python猴子补丁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解Python猴子补丁”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

题目:谈谈你对“猴子补丁”(monkey patching)的理解。

“猴子补丁”是动态类型语言的一个特性,代码运行时在不修改源代码的前提下改变代码中的方法、属性、函数等以达到热补丁(hot patch)的效果。很多系统的安全补丁也是通过猴子补丁的方式来实现的,但实际开发中应该避免对猴子补丁的使用,以免造成代码行为不一致的问题。

在使用gevent库的时候,我们会在代码开头的地方执行gevent.monkey.patch_all(),这行代码的作用是把标准库中的Socket模块给替换掉,这样我们在使用socket的时候,不用修改任何代码就可以实现对代码的协程化,达到提升性能的目的,这就是对猴子补丁的应用。

另外,如果希望用uJSON三方库替换掉标准库中的json,也可以使用猴子补丁的方式,代码如下所示。

import json, ujson

json.__name__ = 'ujson'
json.dumps = ujson.dumps
json.loads = ujson.loads

单元测试中的Mock技术也是对猴子补丁的应用,Python中的unittest.mock模块就是解决单元测试中用Mock对象替代被测对象所依赖的对象的模块。

怎么理解Python猴子补丁

题目32:阅读下面的代码说出运行结果。

class A:
   def who(self):
       print('A', end='')

class B(A):
   def who(self):
       super(B, self).who()
       print('B', end='')

class C(A):
   def who(self):
       super(C, self).who()
       print('C', end='')

class D(B, C):
   def who(self):
       super(D, self).who()
       print('D', end='')

item = D()
item.who()

点评:这道题考查到了两个知识点。知识点一:Python中的MRO(方法解析顺序)。在没有多重继承的情况下,向对象发出一个消息,如果对象没有对应的方法,那么向上(父类)搜索的顺序是非常清晰的。如果向上追溯到object类(所有类的父类)都没有找到对应的方法,那么将会引发AttributeError异常。但是有多重继承尤其是出现菱形继承(钻石继承)的时候,向上追溯到底应该找到那个方法就得确定MRO。Python 3中的类以及Python 2中的新式类使用C3算法来确定MRO,它是一种类似于广度优先搜索的方法;Python 2中的旧式类(经典类)使用深度优先搜索来确定MRO。在搞不清楚MRO的情况下,可以使用类的mro方法或__mro__属性来获得类的MRO列表。知识点二:super()函数的使用。在使用super函数时,可以通过super(类型, 对象)来指定对哪个对象以哪个类为起点向上搜索父类方法。所以上面B类代码中的super(B, self).who()表示以B类为起点,向上搜索self(D类对象)的who方法,所以会找到C类中的who方法,因为D类对象的MRO列表是D --> B --> C --> A --> object。

ACBD

题目33:编写一个函数实现对逆波兰表达式求值,不能使用Python的内置函数。

点评:逆波兰表达式也称为“后缀表达式”,相较于平常我们使用的“中缀表达式”,逆波兰表达式不需要括号来确定运算的优先级,例如5 * (2 + 3)对应的逆波兰表达式是5 2 3 + *。逆波兰表达式求值需要借助栈结构,扫描表达式遇到运算数就入栈,遇到运算符就出栈两个元素做运算,将运算结果入栈。表达式扫描结束后,栈中只有一个数,这个数就是最终的运算结果,直接出栈即可。

import operatorclass Stack:
   """栈(FILO)"""

   def __init__(self):
       self.elems = []

   def push(self, elem):
       """入栈"""
       self.elems.append(elem)

   def pop(self):
       """出栈"""
       return self.elems.pop()

   @property
   def is_empty(self):
       """检查栈是否为空"""
       return len(self.elems) == 0def eval_suffix(expr):
   """逆波兰表达式求值"""
   operators = {
       '+': operator.add,
       '-': operator.sub,
       '*': operator.mul,
       '/': operator.truediv
   }
   stack = Stack()
   for item in expr.split():
       if item.isdigit():
           stack.push(float(item))
       else:              
           num2 = stack.pop()
           num1 = stack.pop()
           stack.push(operators[item](num1, num2))
   return stack.pop()

题目34:Python中如何实现字符串替换操作?

Python中实现字符串替换大致有两类方法:字符串的replace方法和正则表达式的sub方法。

方法一:使用字符串的replace方法。

message = 'hello, world!'
print(message.replace('o', 'O').replace('l', 'L').replace('he', 'HE'))

方法二:使用正则表达式的sub方法。

import re

message = 'hello, world!'
pattern = re.compile('[aeiou]')
print(pattern.sub('#', message))

扩展:还有一个面试题,列表中保存了一系列的文件名,如filenames = ['a9.txt', 'a12.txt', 'a8.txt', 'b2.txt', 'b19.txt','a3.txt'],对这些文件名进行排序,要求按照字面表和数字大小进行排序,简单的说就是a9.txt会排在a12.txt的前面,b2.txt会排在b19.txt的前面。大家可以思考下这个问题如何解决。

题目35:如何剖析Python代码的执行性能?

剖析代码性能可以使用Python标准库中的cProfile和pstats模块,cProfile的run函数可以执行代码并收集统计信息,创建出Stats对象并打印简单的剖析报告。Stats是pstats模块中的类,它是一个统计对象。当然,也可以使用三方工具line_profiler和memory_profiler来剖析每一行代码耗费的时间和内存,这两个三方工具都会用非常友好的方式输出剖析结构。如果使用PyCharm,可以利用“Run”菜单的“Profile”菜单项对代码进行性能分析,PyCharm中可以用统计表格(Statistics)或者调用图(Call Graph)的方式来显示性能剖析的结果。

下面是使用cProfile剖析代码性能的例子。

example.py

import cProfiledef is_prime(num):
   for factor in range(2, int(num ** 0.5) + 1):
       if num % factor == 0:
           return False
   return Trueclass PrimeIter:

   def __init__(self, total):
       self.counter = 0
       self.current = 1
       self.total = total

   def __iter__(self):
       return self

   def __next__(self):
       if self.counter < self.total:
           self.current += 1
           while not is_prime(self.current):
               self.current += 1
           self.counter += 1
           return self.current
       raise StopIteration()cProfile.run('list(PrimeIter(10000))')

如果使用line_profiler三方工具,可以直接剖析is_prime函数每行代码的性能,需要给is_prime函数添加一个profiler装饰器,代码如下所示。

@profiler
def is_prime(num):
   for factor in range(2, int(num ** 0.5) + 1):
       if num % factor == 0:
           return False
   return True

安装line_profiler。

pip install line_profiler

使用line_profiler。

kernprof -lv example.py

运行结果如下所示。

Line #    Hits    Time      Per Hit  % Time  Line Contents
==============================================================
    1                                       @profile
    2                                       def is_prime(num):
    3    86624   48420.0   0.6      50.5        for factor in range(2, int(num ** 0.5) + 1):
    4    85624   44000.0   0.5      45.9            if num % factor == 0:
    5    6918     3080.0   0.4       3.2                return False
    6    1000      430.0   0.4       0.4        return True

到此,关于“怎么理解Python猴子补丁”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 怎么理解Python猴子补丁

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

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

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

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

下载Word文档
猜你喜欢
  • 怎么理解Python猴子补丁
    这篇文章主要介绍“怎么理解Python猴子补丁”,在日常操作中,相信很多人在怎么理解Python猴子补丁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解Python猴子补丁”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-01
  • Python中的鸭子类型和猴子补丁怎么使用
    本篇内容主要讲解“Python中的鸭子类型和猴子补丁怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中的鸭子类型和猴子补丁怎么使用”吧!鸭子类型引用维基百科中的一段解释:鸭子类...
    99+
    2023-07-06
  • 简单聊聊Python中的鸭子类型和猴子补丁
    目录前言鸭子类型猴子补丁总结前言 Python 开发者可能都听说过鸭子类型和猴子补丁这两个词,即使没听过,也大概率写过相关的代码,只不过并不了解其背后的技术要点是这两个词而已。 我最...
    99+
    2024-04-02
  • win7补丁怎么清理
    本篇内容主要讲解“win7补丁怎么清理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“win7补丁怎么清理”吧!鼠标双击打开“计算机”。在界面中,鼠标右键点击“属性”。在窗口中,点击“磁盘清理”,...
    99+
    2023-06-28
  • java怎么解决猴子吃桃问题
    这篇文章主要介绍“java怎么解决猴子吃桃问题”,在日常操作中,相信很多人在java怎么解决猴子吃桃问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java怎么解决猴子吃桃...
    99+
    2024-04-02
  • Linux系统怎么生成补丁和打补丁
    Linux系统怎么生成补丁和打补丁,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。生成补丁:制作 hello.c 和 hello_new.c 两个文件如如下所示。 ...
    99+
    2023-06-28
  • IDEA破解补丁怎么卸载
    抱歉,但我无法提供关于破解补丁的任何指导。破解补丁通常是非法的,违反软件许可协议,并可能导致计算机系统上的安全风险。建议你遵守软件的...
    99+
    2023-08-08
    IDEA
  • Win10怎么升级补丁
    Windows 10 自动更新功能会定期下载并安装系统补丁和更新,以保持系统的安全性和稳定性。以下是升级补丁的常用方法:方法1:使用...
    99+
    2023-08-22
    Win10
  • github怎么下载补丁
    GitHub作为全球最大的开源代码托管平台之一,吸引了全球许多开发者的目光。在GitHub上,开发者们可以分享自己编写的代码,也可以交流学习最前沿的技术。但是,在开发过程中难免会遇到一些问题,需要通过下载别人上传的补丁文件进行修复。那么,如...
    99+
    2023-10-22
  • Python怎么对图像补全并分割成多块补丁
    这篇文章主要介绍了Python怎么对图像补全并分割成多块补丁的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python怎么对图像补全并分割成多块补丁文章都会有所收获,下面我们一起来看看吧。题目编写一个程序,按照...
    99+
    2023-06-30
  • 迅雷7破解补丁怎么安装
    迅雷7破解补丁安装方法:1、搜索可靠的迅雷7破解补丁进行下载;2、下载完后进行解压;3、运行破解程序;4、完成破解之后,我们可以重新连接互联网,并重新启动迅雷7即可。迅雷7是一款功能强大的下载工具,但是它的免费版有一些限制,使用起来不太方便...
    99+
    2023-07-17
  • win7无法卸载kb3035583补丁怎么解决
    如果无法卸载KB3035583补丁,您可以尝试以下方法进行解决:1. 使用控制面板卸载补丁:打开控制面板,点击“程序”或“程序和功能...
    99+
    2023-08-21
    win7
  • win101909更新补丁KB4551762蓝屏怎么解决
    这篇文章主要介绍“win101909更新补丁KB4551762蓝屏怎么解决”,在日常操作中,相信很多人在win101909更新补丁KB4551762蓝屏怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”w...
    99+
    2023-07-01
  • win7升级补丁怎么获取
    在我们使用win7系统的时候,获取最新的补丁不仅仅可以帮助我们及时的修复电脑漏洞,更可以完善系统的一些功能。那么,获取win7升级补丁的方法是什么呢?今天我将与大家分享一下如何获取win7升级补丁。下面就让我们一起来看看吧!获取win7升级...
    99+
    2023-07-20
  • Python递归实现猴子吃桃问题及解析
    目录Python递归实现猴子吃桃Python函数(闰年&猴子偷桃)问题函数作业Python递归实现猴子吃桃 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多...
    99+
    2024-04-02
  • Linux系统怎么更新补丁
    这篇文章主要介绍“Linux系统怎么更新补丁”,在日常操作中,相信很多人在Linux系统怎么更新补丁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux系统怎么更新补丁”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-10
  • PHP漏洞补丁怎么修复
    修复 PHP 漏洞需要按照以下步骤进行:1. 更新 PHP 版本:首先,确保你使用的是最新的 PHP 版本。PHP 社区会定期发布新...
    99+
    2023-09-06
    PHP
  • windows pdf补丁怎么重命名
    这篇文章主要介绍“windows pdf补丁怎么重命名”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“windows pdf补丁怎么重命名”文章能帮助大家解决问题。pdf补丁丁重命名第一步,打开“pd...
    99+
    2023-07-02
  • 迅雷会员补丁怎么用
    迅雷会员补丁使用方法:1、安装完成后,打开迅雷会员补丁;2、选择需要使用迅雷会员补丁的迅雷软件,点击开始激活;3、 等待数秒钟,迅雷会员补丁会自动破解迅雷会员的登录验证,成功激活会员特权;4、打开已激活的迅雷软件,登录自己的免费账号;5、登...
    99+
    2023-07-13
  • linux怎么查看系统补丁
    要查看Linux系统的补丁信息,可以使用以下几种方法: 使用命令行工具:可以使用以下命令来查看系统已安装的补丁信息和更新情况: ...
    99+
    2024-03-02
    linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作