python利用MethodType綁定方法到類示例代碼
前言
本文主要給大家介紹了關(guān)于python用MethodType綁定方法到類的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細的介紹:
對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)#結(jié)果都是15
運行這段代碼我們會發(fā)現(xiàn)輸出結(jié)果都是15,我們明明分別設(shè)置了A和B對象的屬性值,為什么,會這樣呢?開始我也有一樣的疑問,后來發(fā)現(xiàn)是對MethodType的理解不夠,經(jīng)過查證,得到如下解釋。
解析
Stu類本身并沒有屬性和方法,所以用這個類創(chuàng)建的實例也沒有屬性和方法。用MethodType將set_age方法綁定到Stu類,并不是將這個方法直接寫到Stu類內(nèi)部,而是在Stu內(nèi)存中創(chuàng)建一個link指向外部的方法,在創(chuàng)建Stu實例的時候這個link也會被復(fù)制。所以不管創(chuàng)建多少實例,這些實例和Stu類都指向同一個set_age方法。A.set_age(10)
并沒有在A這個實例內(nèi)部創(chuàng)建age屬性,而是將age屬性創(chuàng)建在外部set_age方法的內(nèi)存區(qū)中。因為A和B內(nèi)部link都指向外部set_age方法的內(nèi)存區(qū),所以不管A還是B在調(diào)用set_age方法的時候改變的是set_age方法內(nèi)存區(qū)里的age屬性,所以A改了B也就改了,如果新建一個實例C在沒有調(diào)用set_age方法的前提下也會有age屬性,因為C的link指向的set_age方法的內(nèi)存區(qū),而set_age之前被A或者B調(diào)用過了。
總結(jié)
大概意思就是通過這樣綁定的方法設(shè)置的屬性有點java中靜態(tài)變量的意思
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
pytorch如何保存訓(xùn)練模型參數(shù)并實現(xiàn)繼續(xù)訓(xùn)練
這篇文章主要介紹了pytorch如何保存訓(xùn)練模型參數(shù)并實現(xiàn)繼續(xù)訓(xùn)練問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09Tensorflow安裝問題: Could not find a version that satisfies the
這篇文章主要介紹了Tensorflow安裝問題: Could not find a version that satisfies the requirement tensorflow,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04pytorch lstm gru rnn 得到每個state輸出的操作
這篇文章主要介紹了pytorch lstm gru rnn 得到每個state輸出的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05FastApi如何快速構(gòu)建一個web項目的實現(xiàn)
本文主要介紹了FastApi如何快速構(gòu)建一個web項目的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03