前言
本文主要給大家介紹了關于python用MethodType綁定方法到類的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹:
對python中MethodType不熟悉的朋友們可以先看看這篇文章
問題引出
先看下面一段代碼:
from types import MethodType def set_age(self,age): self.age=age class Stu(object): pass Stu.set_age=MethodType(set_age,Stu) A=Stu() B=Stu() A.set_age(10) B.set_age(15) print(A.age,B.age)#結果都是15
運行這段代碼我們會發現輸出結果都是15,我們明明分別設置了A和B對象的屬性值,為什么,會這樣呢?開始我也有一樣的疑問,后來發現是對MethodType的理解不夠,經過查證,得到如下解釋。
解析
Stu類本身并沒有屬性和方法,所以用這個類創建的實例也沒有屬性和方法。用MethodType將set_age方法綁定到Stu類,并不是將這個方法直接寫到Stu類內部,而是在Stu內存中創建一個link指向外部的方法,在創建Stu實例的時候這個link也會被復制。所以不管創建多少實例,這些實例和Stu類都指向同一個set_age方法。A.set_age(10)并沒有在A這個實例內部創建age屬性,而是將age屬性創建在外部set_age方法的內存區中。因為A和B內部link都指向外部set_age方法的內存區,所以不管A還是B在調用set_age方法的時候改變的是set_age方法內存區里的age屬性,所以A改了B也就改了,如果新建一個實例C在沒有調用set_age方法的前提下也會有age屬性,因為C的link指向的set_age方法的內存區,而set_age之前被A或者B調用過了。
總結
大概意思就是通過這樣綁定的方法設置的屬性有點java中靜態變量的意思
好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林站長站的支持。
新聞熱點
疑難解答