国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python classmethod 與 staticmethod 小談

keke / 2139人閱讀

摘要:而類的實例并不會影響類的靜態變量,只是會修改對象實例本身的值,所以后面兩個的結果總是同樣,如果我們使用和結果也將僅僅是靜態變量變化后的結果,與類的實例無關以上是對和的暫時做的了解的總結,如有紕漏,請及時指正

概念

python 的classmethod 與staticmethod 這兩個有什么區別? 二者又有什么聯系?
在google和baidu之后, 得到的大致的聯系就是二者都是對類的方法的靜態調用的裝飾器, 即對類的方法的靜態調用可以用這兩種方式實現。
區別體現在classmethod 也可以用類的實例調用, 而staticmethod 則不能如此

原因

假設 class A 中 使用 classmethod 裝飾函數 a, 如下:

class A():
    _info = "hello world"
    @classmethod
    def a(arg):
        print arg._info

那么對a的調用既可以直接類似靜態調用

A.a()

也可以先實例化, 再調用:

aaa = A()
aaa.a()

但如果把classmethod 換成staticmehtod:

class A():
    _info = "hello world"
    @staticmethod
    def a(arg):
        print arg._info

就只能靜態調用了(staticmethod 名字就已經看得出來了)

原因是, classmethod 是類(不是實例化的對象)作為第一個參數傳遞給了函數, 比如在第一個例子里的aaa.a()和A.a(), 都是直接將類或者對象的類(再一次, 不是實例)傳遞進去, 進而實現靜態調用

而staticmethod 只是將函數聲明為靜態方法, 沒有傳遞任何內容進去

靜態變量范圍

在實驗過程中, 類的靜態變量對類的實例產生了一些有趣的影響, 如下

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

結果依次應該是什么呢,如下

14
9
5
5

讓我們產生疑問的是第一個和第二個的結果怎么是14 和 9, 很明顯3+2+9 = 14, 3+2+4 = 9, 是通過這兩種方式的結果, 看起來就像 add_c 里的類的變量影響了 add里的類的實例。

確實如此, 對類的變量的修改會影響類的實例的變量的使用, 所以我們在通過 classname.variable 的方式對類變量做修改的時候一定要小心。

而類的實例并不會影響類的靜態變量,只是會修改對象實例本身的值, 所以后面兩個的結果總是5,5

同樣, 如果我們使用classmethod 和staticmethod

 @staticmethod
 def get_sm():
     return c._num

 @classmethod
 def get_cm(arg):
     print arg
     return arg._num

結果也將僅僅是靜態變量變化后的結果, 與類的實例無關

PS: 以上是對classmethod 和staticmethod 的暫時做的了解的總結, 如有紕漏, 請及時指正

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37888.html

相關文章

  • 90 % 的 Python 開發者不知道的描述符應用

    摘要:由上面的注釋,可以看出其實就相當于一個描述符類,而在此刻變成了一個描述符。調用這個方法可以知道,每調用一次,它都會經過描述符類的。基于描述符如何實現同樣的也是一樣。我想你應該對描述符在中的應用有了更深的理解。好吧,我承認我標題黨了。但是這篇文章的知識點,你有極大的可能并不知道。 前段時間,我寫了一篇描述符的入門級文章,從那些文章里你知道了如何定義描述符,且明白了描述符是如何工作的。 如果你還...

    番茄西紅柿 評論0 收藏0
  • 90 % 的 Python 開發者不知道的描述符應用

    摘要:由上面的注釋,可以看出其實就相當于一個描述符類,而在此刻變成了一個描述符。調用這個方法可以知道,每調用一次,它都會經過描述符類的。基于描述符如何實現同樣的也是一樣。我想你應該對描述符在中的應用有了更深的理解。好吧,我承認我標題黨了。但是這篇文章的知識點,你有極大的可能并不知道。 前段時間,我寫了一篇描述符的入門級文章,從那些文章里你知道了如何定義描述符,且明白了描述符是如何工作的。 如果你還...

    0x584a 評論0 收藏0
  • Pythonstaticmethodclassmethod的比較

    摘要:而呢,它沒有默認的第一個輸入變量。它跟我們在一個空白的里寫的一個普通的函數沒有任何實質的區別。唯一的不同就是你要通過類或者實例來它。 class A(object): def foo(self, x): print executing foo(%s, %s) % (self, x) @classmethod def class_foo(cls,...

    frank_fun 評論0 收藏0
  • classmethod&staticmethod 以及 __slots__

    摘要:什么是中的它的用途是什么裝飾器對應的函數不需要實例化,不需要參數,但第一個參數需要是表示自身類的參數,可以來調用類的屬性,類的方法,實例化對象等。 什么是python中的classmethod,它的用途是什么? classmethod裝飾器對應的函數不需要實例化,不需要 self 參數,但第一個參數需要是表示自身類的 cls 參數,可以來調用類的屬性,類的方法,實例化對象等。 cl...

    newsning 評論0 收藏0
  • 【譯】python 靜態方法和類方法的區別

    摘要:盡管和非常相似,但在用法上依然有一些明顯的區別。所以,從靜態方法的使用中可以看出,我們不會訪問到本身它基本上只是一個函數,在語法上就像一個方法一樣,但是沒有訪問對象和它的內部字段和其他方法,相反會訪問,會訪問。 python staticmethod and classmethod Though classmethod and staticmethod are quite simil...

    Crazy_Coder 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<