日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
替換一個(gè)實(shí)例方法,沒你想的那么簡(jiǎn)單

思路一:簡(jiǎn)單地替換

當(dāng)你想對(duì)類實(shí)例的方法進(jìn)行替換時(shí),你可能想到的是直接對(duì)他進(jìn)行粗暴地替換:

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出孟州免費(fèi)做網(wǎng)站回饋大家。

 
 
 
 
  1. class People: 
  2.     def speak(self): 
  3.         print("hello, world") 
  4.  
  5.  
  6. def speak(self): 
  7.     print("hello, python") 
  8.  
  9. p = People() 
  10. p.speak = speak 
  11. p.speak() 

但當(dāng)你試著執(zhí)行這段代碼的時(shí)候,就會(huì)發(fā)現(xiàn)行不通,它提示我們要傳入 self 參數(shù):

 
 
 
 
  1. Traceback (most recent call last): 
  2.   File "/Users/MING/Code/Python/demo.py", line 12, in  
  3.     p.speak() 
  4. TypeError: speak() missing 1 required positional argument: 'self' 

不對(duì)啊~ self 不是實(shí)例本身嗎?函數(shù)不是一直就這么寫的?

實(shí)際上你這么替換,speak 就變成了一個(gè) function,而不是一個(gè)和實(shí)例綁定的 method ,你可以把替換前后的 speak 打印出來

 
 
 
 
  1. p = People() 
  2. print(p.speak) 
  3. p.speak = speak 
  4. print(p.speak) 

輸出結(jié)果如下,區(qū)別非常明顯

 
 
 
 
  1.  

這種方法,只能用在替換不與實(shí)例綁定的靜態(tài)方法上,不然你每次調(diào)用的時(shí)候,就得手動(dòng)傳入實(shí)例本身,但這樣調(diào)用就會(huì)變得非常怪異。

思路二:利用 im_func

有 Python 2 使用經(jīng)驗(yàn)的朋友,可以會(huì)知道類實(shí)例的方法,都有 im_func 和 im_class 屬性,分別指向了該方法的函數(shù)和類。

很抱歉的是,這些在 Python3 中全都取消了,意味你無法再使用 im_func 和 im_class 。

但即使你身處 Python 2 的環(huán)境下,你想通過 im_func 去直接替換函數(shù),也仍然是有問題的。

因?yàn)樵?Python2 中不推薦普通用戶對(duì)類實(shí)例的方法進(jìn)行替換,所以 Python 給類實(shí)例的方法賦予了只讀屬性

思路三:非常危險(xiǎn)的字節(jié)碼替換

表層不行,但這個(gè)方法在字節(jié)碼層面卻是可行的

這種方法,非常的粗暴且危險(xiǎn),他會(huì)直接影響到使用 People 的所有實(shí)例的 speak 方法,因此這種方法千萬不要使用。

思路四:利用 types 綁定方法

在 types 中有一個(gè) MethodType,可以將普通方法與實(shí)例進(jìn)行綁定。

綁定后,就可以直接替換掉原實(shí)例的 speak 方法了,完整代碼如下:

 
 
 
 
  1. import types 
  2.  
  3. class People: 
  4.     def speak(self): 
  5.         print("hello, world") 
  6.  
  7.  
  8. def speak(self): 
  9.     print("hello, python") 
  10.  
  11. p = People() 
  12. p.speak = types.MethodType(speak, p) 
  13. p.speak() 

這種方法,最為安全,不會(huì)影響其他實(shí)例。并且 Python 2 和 Python 3 都適用,是官方推薦的一種做法。

總結(jié)一下

  • 直接替換:只適用于靜態(tài)方法
  • 使用 im_func 替換:行不通
  • 使用 im_func.func_code 替換字節(jié)碼:非常危險(xiǎn),請(qǐng)不要使用
  • 使用 types.MethodType 進(jìn)行方法綁定:安全且有效,推薦使用

當(dāng)前文章:替換一個(gè)實(shí)例方法,沒你想的那么簡(jiǎn)單
當(dāng)前網(wǎng)址:http://www.5511xx.com/article/dhgpejg.html