成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

替換一個實例方法,沒你想的那么簡單

開發 后端
當你想對類實例的方法進行替換時,你可能想到的是直接對他進行粗暴地替換,但當你試著執行這段代碼的時候,就會發現行不通,它提示我們要傳入 self 參數。

思路一:簡單地替換

[[390247]]

當你想對類實例的方法進行替換時,你可能想到的是直接對他進行粗暴地替換:

  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() 

但當你試著執行這段代碼的時候,就會發現行不通,它提示我們要傳入 self 參數:

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

不對啊~ self 不是實例本身嗎?函數不是一直就這么寫的?

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

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

輸出結果如下,區別非常明顯

  1. <bound method People.speak of <__main__.People object at 0x10cfa7fd0>> 
  2. <function speak at 0x10ca10040> 

這種方法,只能用在替換不與實例綁定的靜態方法上,不然你每次調用的時候,就得手動傳入實例本身,但這樣調用就會變得非常怪異。

思路二:利用 im_func

有 Python 2 使用經驗的朋友,可以會知道類實例的方法,都有 im_func 和 im_class 屬性,分別指向了該方法的函數和類。

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

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

因為在 Python2 中不推薦普通用戶對類實例的方法進行替換,所以 Python 給類實例的方法賦予了只讀屬性

思路三:非常危險的字節碼替換

表層不行,但這個方法在字節碼層面卻是可行的

這種方法,非常的粗暴且危險,他會直接影響到使用 People 的所有實例的 speak 方法,因此這種方法千萬不要使用。

思路四:利用 types 綁定方法

在 types 中有一個 MethodType,可以將普通方法與實例進行綁定。

綁定后,就可以直接替換掉原實例的 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() 

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

總結一下

  • 直接替換:只適用于靜態方法
  • 使用 im_func 替換:行不通
  • 使用 im_func.func_code 替換字節碼:非常危險,請不要使用
  • 使用 types.MethodType 進行方法綁定:安全且有效,推薦使用

 

責任編輯:趙寧寧 來源: Python編程時光
相關推薦

2015-04-30 10:12:13

開源云平臺OpenStack

2017-08-09 14:49:03

WebHTTPS瀏覽器

2024-10-31 11:49:41

Kafka管理死信隊列

2014-08-25 10:17:54

數據中心管理

2020-03-26 10:41:02

API網關大公司

2014-03-14 09:35:56

內存優化軟件內存優化

2016-01-07 10:17:48

2015-06-24 10:32:13

訊鳥云計算會展

2021-08-02 15:24:19

Windows 11Windows微軟

2014-03-21 15:30:06

產品經理PM能力

2023-12-28 12:07:21

2011-09-08 13:41:53

Widget

2014-07-09 09:06:33

SDN自動化

2013-01-15 10:09:43

Windows Ser

2016-07-25 12:58:07

SDN路由故障排查

2010-08-04 09:20:31

JavaScript

2009-06-22 14:02:00

2021-12-14 17:19:15

存儲數據

2019-05-17 09:33:50

圖像識別三維重建文本識別

2020-01-03 08:44:05

TCP網絡協議三次握手
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 紧缚调教一区二区三区视频 | 欧美人成在线视频 | 精久久久| 日韩在线视频网址 | 91免费电影| www.国产视频 | 国产中文在线 | 国产男女视频网站 | 欧美综合国产精品久久丁香 | 国产精品视频一区二区三区 | 国产日韩一区二区 | 亚洲国产69 | 国产成人自拍一区 | 欧美日韩国产精品一区 | 国产夜恋视频在线观看 | 欧美日韩综合视频 | 天天综合天天 | 欧美日韩国产一区二区三区不卡 | 日日操av | 好姑娘影视在线观看高清 | 精品一区二区三 | 在线观看视频中文字幕 | 一区二区精品 | 午夜视频免费在线观看 | 久久久国产亚洲精品 | 99国产视频 | 欧美日韩国产一区二区三区 | 日韩资源 | 日日干夜夜操天天操 | 一区二区三区四区在线 | 久久精品 | 日韩欧美在线视频 | 精品国产乱码久久久 | 亚洲一区二区高清 | 国产一区二区三区在线视频 | 日日躁狠狠躁aaaaxxxx | 亚洲视频国产视频 | 国产性色视频 | 日韩影院在线观看 | 天天拍天天草 | 久久久国产亚洲精品 |