国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

python的猴子補(bǔ)丁(Monkey Patching)

這篇具有很好參考價(jià)值的文章主要介紹了python的猴子補(bǔ)丁(Monkey Patching)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1. 什么是猴子補(bǔ)丁

Python是一種典型的動(dòng)態(tài)腳本語言。它不僅具有 動(dòng)態(tài)類型(dynamic type) ,而且它的 對(duì)象模型(object model) 也是動(dòng)態(tài)的。Python的類是可變的(mutable),方法(methods)只是類的屬性(attributes);這允許我們?cè)?運(yùn)行時(shí)(run time) 修改其行為。這被稱為猴子補(bǔ)丁(Monkey Patching), 它指的是偷偷地更改代碼。

Monkey Patching只是在 運(yùn)行時(shí)(run time) 動(dòng)態(tài)替換屬性(attributes)。 而在Python中,術(shù)語monkey patch指的是對(duì)函數(shù)(function)、類(class)或模塊(module)的動(dòng)態(tài)(或運(yùn)行時(shí))修改。

2. 舉例說明

假設(shè)在monkey.py文件中已經(jīng)定義了一個(gè)類:

# monkey.py
class Me:
    def who_am_i(self):
        print("I am a Monkey")

假設(shè)monkey.py文件中的Me這個(gè)類不是我寫的,我只是用到了這個(gè)類 為了演示的方便,這個(gè)類只有一個(gè)who_am_i() 方法,作用是打印"I am a Monkey"
現(xiàn)在我在另外一個(gè)文件中想要調(diào)用這個(gè)類,但是發(fā)現(xiàn)這個(gè)類里面的who_am_i() 方法不是我想要的內(nèi)容。

由于我是一個(gè)人類,我不喜歡打印我是一個(gè)猴子,我想要打印 “I am human”,
所以我給猴子對(duì)象打補(bǔ)?。ㄟ@里是一個(gè)雙關(guān)語,就是monkey patch的名字的來源),我們可以這么實(shí)現(xiàn):

import monkey  # 導(dǎo)入用到的別人寫的monkey模塊
?
def i_am_human(self):  # 定義一個(gè)我們想要的方法
    print("I am human")
?
print(f"{monkey.Me.who_am_i = }")  # 替換前,將原來的方法地址打印出來
monkey.Me.who_am_i = i_am_human  # 將"who_am_i"的地址替換為"i_am_human"
print(f"{monkey.Me.who_am_i = }")  # 替換后,將原來的方法地址打印出來
?
obj = monkey.Me()  # 實(shí)例化一個(gè)對(duì)象
?
print(f"{hasattr(obj, 'i_am_human') = }")
print(f"{hasattr(obj, 'who_am_i') = }")
obj.who_am_i()  # 直接調(diào)用 "who_am_i" 而不是 "i_am_human()"

輸出的結(jié)果:

monkey.Me.who_am_i = <function Me.who_am_i at 0x7ff6ab1d9af0>
monkey.Me.who_am_i = <function i_am_human at 0x7ff6ab2a0310>
hasattr(obj, 'i_am_human') = False
hasattr(obj, 'who_am_i') = True
I am human

這個(gè)例子的結(jié)論:

1.我們可以自己定義一個(gè)新的方法(或者函數(shù))來更改掉原來類的方法
2.替換以后,原來類的方法名稱還在,但是它的內(nèi)存地址已經(jīng)發(fā)生變化了
3.調(diào)用的時(shí)候,只能使用原來的方法名來調(diào)用,而不是新的方法名稱
4.新的方法名稱只是包含了實(shí)現(xiàn)過程,對(duì)于類本身,是看不到這個(gè)方法名稱的。

3. 其他對(duì)象使用猴子補(bǔ)丁

3.1. 使用猴子補(bǔ)丁修復(fù)類的實(shí)例

上面使用了猴子補(bǔ)丁來修復(fù)了一個(gè)類的方法, 那么該類的所有實(shí)例使用該方法的時(shí)候都將使用的是修補(bǔ)后的方法。

如果我們想要減少影響,只修補(bǔ)特定的實(shí)例對(duì)象, 可是可以完成的,代碼如下:

import types
import monkey  # 導(dǎo)入用到的別人寫的monkey模塊
?
monkey1 = monkey.Me()
monkey2 = monkey.Me()
?
def i_am_human(self):
    print("I am human")
?
monkey2.who_am_i = types.MethodType(i_am_human, monkey2)
monkey1.who_am_i()
monkey2.who_am_i()

輸出的結(jié)果:

I am a Monkey
I am human

這個(gè)例子的結(jié)論:

同一個(gè)類的兩個(gè)實(shí)例中,我們可以單獨(dú)給某一個(gè)實(shí)例打猴子補(bǔ)丁,而完全不影響另外一個(gè)實(shí)例.

3.2. 其他對(duì)象使用猴子補(bǔ)丁

我們還可以對(duì)其他的對(duì)象使用猴子補(bǔ)丁,比如模塊等, 這里有一個(gè)比較實(shí)用的例子:

比如你的一個(gè)項(xiàng)目中,很多python文件中都用到了import json,后來發(fā)現(xiàn)如果使用ujson性能會(huì)更高, 但是覺得把每個(gè)文件的 import json 都改成 import ujson as json 成本較高(不要光想著替換,很多項(xiàng)目不僅僅有你一個(gè)開發(fā)人員); 或者僅僅想測(cè)試一下用ujson替換json是否符合預(yù)期。
對(duì)于這種需求,只需要在程序的主入口處加上下面的代碼:

import json  
import ujson  
?
def monkey_patch_json():  
    json.__name__ = 'ujson'  
    json.dumps = ujson.dumps  
    json.loads = ujson.loads  
?
monkey_patch_json()

這樣后面:

  • 所有用到j(luò)son.dumps就會(huì)自動(dòng)調(diào)用ujson.dumps
  • 所有用到j(luò)son.loads就會(huì)自動(dòng)調(diào)用ujson.loads

4. 使用場(chǎng)景與注意事情

可以看到猴子修補(bǔ)非常強(qiáng)大,幾乎可以在任何地方修改原來類的實(shí)現(xiàn)或者對(duì)象的原有功能。但是恰恰是由于其可以隨時(shí)隨地修改,會(huì)造成某個(gè)對(duì)象的具體功能是在哪兒實(shí)現(xiàn)的這點(diǎn)非常不明確(破環(huán)封裝),這會(huì)嚴(yán)重影響程序的魯棒性,容易引發(fā)不必要的Bug。 所以要慎用!

猴子補(bǔ)丁合適的使用場(chǎng)景:

  1. 我們正在處理來自其他人的寫的公共代碼,優(yōu)化了一個(gè)小的實(shí)現(xiàn),我們目前不想對(duì)其源碼進(jìn)行修改(因?yàn)槠渌诉€有可能在用這些代碼,或者其他版本中有可能用到),我可以將這個(gè)補(bǔ)丁放在自己的代碼中,即保證了功能的實(shí)現(xiàn),也不影響別人實(shí)現(xiàn)
  2. 我們正在處理來自其他人的遺留代碼或代碼,我們不想對(duì)其進(jìn)行廣泛修改,但仍然希望使其與不同版本的庫或環(huán)境一起運(yùn)行,這非常有用。

因此,對(duì)于猴子補(bǔ)丁,我個(gè)人建議:文章來源地址http://www.zghlxwxcb.cn/news/detail-781115.html

  • 如果代碼的影響范圍可控,不要使用猴子補(bǔ)丁,直接更改原來方法的實(shí)現(xiàn)
  • 如果要使用猴子補(bǔ)丁,盡量在最終端的類或者實(shí)例中,不要在中間類中使用

到了這里,關(guān)于python的猴子補(bǔ)丁(Monkey Patching)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 快速搭建API隨心搭,讓你的web開發(fā)更加高效

    快速搭建API隨心搭,讓你的web開發(fā)更加高效

    隨著互聯(lián)網(wǎng)的發(fā)展,越來越多的應(yīng)用和服務(wù)需要通過API接口來實(shí)現(xiàn)。API(Application Programming Interface,應(yīng)用程序編程接口)可以理解為兩個(gè)軟件之間的橋梁,通過API接口,兩個(gè)軟件可以相互交流并進(jìn)行數(shù)據(jù)交換。如今,API已經(jīng)成為許多公司和應(yīng)用程序的核心,因此快速搭建并管

    2024年02月08日
    瀏覽(23)
  • python經(jīng)典百題之猴子吃桃

    遞歸法是一種自頂向下的解題思路,通過將大問題逐步分解為小問題,求解最終結(jié)果。 首先,定義一個(gè)遞歸函數(shù)peach_count(n),表示第n天剩余桃子的數(shù)量。當(dāng)n為10時(shí),剩余桃子數(shù)為1。 遞推公式為peach_count(n) = 2 * (peach_count(n+1) + 1),表示第n天剩余的桃子數(shù)量是第n+1天剩余桃子數(shù)

    2024年02月08日
    瀏覽(20)
  • adb logcat輸出日志分析和monkey輸出日志分析,提交給開發(fā)的內(nèi)容

    adb logcat輸出日志分析和monkey輸出日志分析,提交給開發(fā)的內(nèi)容

    對(duì)于app測(cè)試所獲取的日志,主要是為了看程序出現(xiàn)的crash和anr 手工測(cè)試app,需要提交給開發(fā)的內(nèi)容 adb logcat -c 清理現(xiàn)有日志 adb logcat -v time D:log.txt 輸出帶時(shí)間戳的日志到電腦上,開始手工測(cè)試,日志會(huì)自動(dòng)持續(xù)記錄到log.txt中 1. 對(duì)于crash錯(cuò)誤,需要提交給開發(fā)的內(nèi)容? 日志中

    2024年02月03日
    瀏覽(30)
  • 交友系統(tǒng)程序開發(fā),前后端源碼交付,允許二開,UI配色新穎,APP小程序H5隨心搭配!

    交友系統(tǒng)程序開發(fā),前后端源碼交付,允許二開,UI配色新穎,APP小程序H5隨心搭配!

    在開發(fā)設(shè)計(jì)與測(cè)試階段,主要包括了程序開發(fā)、測(cè)試和上線運(yùn)營等環(huán)節(jié)。根據(jù)產(chǎn)品經(jīng)理確定的功能需求,開發(fā)團(tuán)隊(duì)開始進(jìn)行具體的編程和開發(fā)工作。這個(gè)過程中需要考慮到不同設(shè)備、不同系統(tǒng)和不同版本的需求,確保軟件可以在不同平臺(tái)上穩(wěn)定運(yùn)行。 測(cè)試是確保軟件質(zhì)量的重

    2024年01月20日
    瀏覽(19)
  • C語言應(yīng)用層程序熱補(bǔ)丁

    一個(gè)正在運(yùn)行的程序,要是有某函數(shù)或某流程有問題,需要修改,有兩個(gè)方式: 1.通過設(shè)置LD_PRELOAD把需要的庫重新定向,但這種方式需要重啟正在運(yùn)行的程序。 2.通過修改可執(zhí)行文件某個(gè)函數(shù)指向的地址,指向新的函數(shù),這種方式可不重啟正在運(yùn)行的程序。這就熱補(bǔ)丁(hotp

    2024年01月22日
    瀏覽(11)
  • Python每日一練——第10天:經(jīng)典問題猴子吃桃

    Python每日一練——第10天:經(jīng)典問題猴子吃桃

    猴子第一天摘下若干個(gè)桃子,當(dāng)即吃了一半,還不過癮,又多吃了一個(gè)。 第二天早上又將剩下的桃子吃掉一半,又多吃了一個(gè)。以后每天早上都吃了前一天剩下的一半零一個(gè)。 到第10天早上想再吃時(shí),見只剩下一個(gè)桃子了。 求原來它一共摘了多少個(gè)桃子。 這題得倒著推。第

    2024年02月07日
    瀏覽(19)
  • 【華為OD機(jī)試真題】46、 猴子爬山 | 機(jī)試真題+思路參考+代碼解析(C語言、C++、Java、Py、JS)

    ??個(gè)人博客首頁: KJ.JK ? ??專欄介紹: 華為OD機(jī)試真題匯總,定期更新華為OD各個(gè)時(shí)間階段的機(jī)試真題,每日定時(shí)更新,本專欄將使用C語言、C++、Java、Python、JS語言進(jìn)行更新解答,包含真題,思路分析,代碼參考,歡迎大家訂閱學(xué)習(xí) ??題目描述 一天一只頑猴想去從山腳爬

    2024年02月13日
    瀏覽(37)
  • 華為OD機(jī)試 - 猴子爬山(Java & JS & Python & C & C++)

    哈嘍,本題庫完全免費(fèi),收費(fèi)是為了防止被爬,大家訂閱專欄后可以私信聯(lián)系退款。感謝支持 一天一只頑猴想去從山腳爬到山頂,途中經(jīng)過一個(gè)有個(gè)N個(gè)臺(tái)階的階梯,但是這猴子有一個(gè)習(xí)慣: 每一次只能跳1步或跳3步,試問猴子通過這個(gè)階梯有多少種不同的跳躍方式?

    2024年04月09日
    瀏覽(18)
  • 前端開發(fā)語言有哪些

    前端開發(fā)語言有哪些 在數(shù)字時(shí)代,前端開發(fā)已經(jīng)成為軟件開發(fā)領(lǐng)域的一個(gè)重要分支。前端開發(fā)主要關(guān)注的是用戶界面(UI)和用戶體驗(yàn)(UX),而實(shí)現(xiàn)這些的關(guān)鍵在于選擇適合的前端開發(fā)語言。本文將詳細(xì)介紹前端開發(fā)中常用的幾種語言,包括HTML、CSS、JavaScript,以及近年來興

    2024年04月08日
    瀏覽(16)
  • 【免費(fèi)題庫】華為OD機(jī)試 - 貪吃的猴子(Java & JS & Python & C & C++)

    哈嘍,本題庫完全免費(fèi),收費(fèi)是為了防止被爬,大家訂閱專欄后可以私信聯(lián)系退款。感謝支持 一只貪吃的猴子,來到一個(gè)果園,發(fā)現(xiàn)許多串香蕉排成一行,每串香蕉上有若干根香蕉。每串香蕉的根數(shù)由數(shù)組numbers給出。 猴子獲取香蕉,每次都只能從行的開頭或者末尾獲取,并

    2024年04月09日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包