摘要:而類的實(shí)例并不會(huì)影響類的靜態(tài)變量,只是會(huì)修改對(duì)象實(shí)例本身的值,所以后面兩個(gè)的結(jié)果總是同樣,如果我們使用和結(jié)果也將僅僅是靜態(tài)變量變化后的結(jié)果,與類的實(shí)例無關(guān)以上是對(duì)和的暫時(shí)做的了解的總結(jié),如有紕漏,請(qǐng)及時(shí)指正
概念
python 的classmethod 與staticmethod 這兩個(gè)有什么區(qū)別? 二者又有什么聯(lián)系?
在google和baidu之后, 得到的大致的聯(lián)系就是二者都是對(duì)類的方法的靜態(tài)調(diào)用的裝飾器, 即對(duì)類的方法的靜態(tài)調(diào)用可以用這兩種方式實(shí)現(xiàn)。
區(qū)別體現(xiàn)在classmethod 也可以用類的實(shí)例調(diào)用, 而staticmethod 則不能如此
假設(shè) class A 中 使用 classmethod 裝飾函數(shù) a, 如下:
class A(): _info = "hello world" @classmethod def a(arg): print arg._info
那么對(duì)a的調(diào)用既可以直接類似靜態(tài)調(diào)用
A.a()
也可以先實(shí)例化, 再調(diào)用:
aaa = A() aaa.a()
但如果把classmethod 換成staticmehtod:
class A(): _info = "hello world" @staticmethod def a(arg): print arg._info
就只能靜態(tài)調(diào)用了(staticmethod 名字就已經(jīng)看得出來了)
原因是, classmethod 是類(不是實(shí)例化的對(duì)象)作為第一個(gè)參數(shù)傳遞給了函數(shù), 比如在第一個(gè)例子里的aaa.a()和A.a(), 都是直接將類或者對(duì)象的類(再一次, 不是實(shí)例)傳遞進(jìn)去, 進(jìn)而實(shí)現(xiàn)靜態(tài)調(diào)用
而staticmethod 只是將函數(shù)聲明為靜態(tài)方法, 沒有傳遞任何內(nèi)容進(jìn)去
靜態(tài)變量范圍在實(shí)驗(yàn)過程中, 類的靜態(tài)變量對(duì)類的實(shí)例產(chǎn)生了一些有趣的影響, 如下
class c(): _num = 0 def add(self,num): self._num += num def add_c(self,num) c._num += num def get(self): return self._nu def get_c(self): return c._num if __name__ == "__main_ c1 = c() c2 = c() c1.add_c(3) c2.add_c(2) c1.add(9) c2.add(4) print c1.get()#? print c2.get()#? print c1.get_c()#? print c2.get_c()#?
結(jié)果依次應(yīng)該是什么呢,如下
14 9 5 5
讓我們產(chǎn)生疑問的是第一個(gè)和第二個(gè)的結(jié)果怎么是14 和 9, 很明顯3+2+9 = 14, 3+2+4 = 9, 是通過這兩種方式的結(jié)果, 看起來就像 add_c 里的類的變量影響了 add里的類的實(shí)例。
確實(shí)如此, 對(duì)類的變量的修改會(huì)影響類的實(shí)例的變量的使用, 所以我們?cè)谕ㄟ^ classname.variable 的方式對(duì)類變量做修改的時(shí)候一定要小心。
而類的實(shí)例并不會(huì)影響類的靜態(tài)變量,只是會(huì)修改對(duì)象實(shí)例本身的值, 所以后面兩個(gè)的結(jié)果總是5,5
同樣, 如果我們使用classmethod 和staticmethod
@staticmethod def get_sm(): return c._num @classmethod def get_cm(arg): print arg return arg._num
結(jié)果也將僅僅是靜態(tài)變量變化后的結(jié)果, 與類的實(shí)例無關(guān)
PS: 以上是對(duì)classmethod 和staticmethod 的暫時(shí)做的了解的總結(jié), 如有紕漏, 請(qǐng)及時(shí)指正
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/37888.html
摘要:由上面的注釋,可以看出其實(shí)就相當(dāng)于一個(gè)描述符類,而在此刻變成了一個(gè)描述符。調(diào)用這個(gè)方法可以知道,每調(diào)用一次,它都會(huì)經(jīng)過描述符類的?;诿枋龇绾螌?shí)現(xiàn)同樣的也是一樣。我想你應(yīng)該對(duì)描述符在中的應(yīng)用有了更深的理解。好吧,我承認(rèn)我標(biāo)題黨了。但是這篇文章的知識(shí)點(diǎn),你有極大的可能并不知道。 前段時(shí)間,我寫了一篇描述符的入門級(jí)文章,從那些文章里你知道了如何定義描述符,且明白了描述符是如何工作的。 如果你還...
摘要:由上面的注釋,可以看出其實(shí)就相當(dāng)于一個(gè)描述符類,而在此刻變成了一個(gè)描述符。調(diào)用這個(gè)方法可以知道,每調(diào)用一次,它都會(huì)經(jīng)過描述符類的?;诿枋龇绾螌?shí)現(xiàn)同樣的也是一樣。我想你應(yīng)該對(duì)描述符在中的應(yīng)用有了更深的理解。好吧,我承認(rèn)我標(biāo)題黨了。但是這篇文章的知識(shí)點(diǎn),你有極大的可能并不知道。 前段時(shí)間,我寫了一篇描述符的入門級(jí)文章,從那些文章里你知道了如何定義描述符,且明白了描述符是如何工作的。 如果你還...
摘要:而呢,它沒有默認(rèn)的第一個(gè)輸入變量。它跟我們?cè)谝粋€(gè)空白的里寫的一個(gè)普通的函數(shù)沒有任何實(shí)質(zhì)的區(qū)別。唯一的不同就是你要通過類或者實(shí)例來它。 class A(object): def foo(self, x): print executing foo(%s, %s) % (self, x) @classmethod def class_foo(cls,...
摘要:什么是中的它的用途是什么裝飾器對(duì)應(yīng)的函數(shù)不需要實(shí)例化,不需要參數(shù),但第一個(gè)參數(shù)需要是表示自身類的參數(shù),可以來調(diào)用類的屬性,類的方法,實(shí)例化對(duì)象等。 什么是python中的classmethod,它的用途是什么? classmethod裝飾器對(duì)應(yīng)的函數(shù)不需要實(shí)例化,不需要 self 參數(shù),但第一個(gè)參數(shù)需要是表示自身類的 cls 參數(shù),可以來調(diào)用類的屬性,類的方法,實(shí)例化對(duì)象等。 cl...
摘要:盡管和非常相似,但在用法上依然有一些明顯的區(qū)別。所以,從靜態(tài)方法的使用中可以看出,我們不會(huì)訪問到本身它基本上只是一個(gè)函數(shù),在語(yǔ)法上就像一個(gè)方法一樣,但是沒有訪問對(duì)象和它的內(nèi)部字段和其他方法,相反會(huì)訪問,會(huì)訪問。 python staticmethod and classmethod Though classmethod and staticmethod are quite simil...
閱讀 3294·2021-11-11 16:55
閱讀 2667·2021-10-13 09:39
閱讀 2507·2021-09-13 10:27
閱讀 2216·2019-08-30 15:55
閱讀 3146·2019-08-30 15:54
閱讀 3187·2019-08-29 16:34
閱讀 1891·2019-08-29 12:41
閱讀 1127·2019-08-29 11:33