Python中的 staticmethod 和 classmethod

眾所周知,類是創(chuàng)建實例的模板早像,而實例是一個個具體的對象僻肖,各個實例擁有的數(shù)據(jù)相互獨立、互不影響卢鹦。

在類中定義的函數(shù)稱為方法臀脏,主要有三種:實例方法、類方法冀自、靜態(tài)方法

class A:

    def instance_method(self, n):
        print('self', self)

    @classmethod
    def class_method(cls, n):
        print('cls', cls)

    @staticmethod
    def static_method():
        print('this is a static method')

上面類 A 定義的三個方法分別是實例方法揉稚、類方法、靜態(tài)方法熬粗,下面我們來詳細分析

實例方法

不帶裝飾器的實例方法在類定義中是最常見的:

定義中搀玖,傳入的第一個參數(shù)必須是 self,表示實例本身驻呐,在其中可使用 self.attr 獲取實例的屬性灌诅。

a = A()
a.instance_method(2)
print(A.bar)
print(a.bar)

下面是程序運行結(jié)果:

self <__main__.A object at 0x0000028554C87E48>
grg
grg

當我們創(chuàng)建了實例 a 之后,調(diào)用 a.instance_method(2) 時含末,實例 a 會被自動傳入函數(shù)作為 self 參數(shù)猜拾。

如果我們調(diào)用 A.instance_method(2) 時會發(fā)生什么呢?即佣盒,類能不能調(diào)用實例方法挎袜?

Traceback (most recent call last):
  File "I:\Program Code\Python\test2.py", line 32, in <module>
    A.instance_method(2)
TypeError: instance_method() missing 1 required positional argument: 'n'

可以看到,數(shù)字 2 被傳入 self 參數(shù)了肥惭,所以才會提示缺少一個位置參數(shù) n盯仪,所以,實例方法不能由類調(diào)用务豺。

順便提一句磨总,屬性也分實例屬性和類屬性嗦明,上例直接定義的是類屬性笼沥,類和類實例都可以訪問。類中定義的方法也可以無限制訪問這個類屬性娶牌。

通過 __init__(self奔浅,attr) 定義的是實例屬性,只有實例能訪問诗良,類不能訪問汹桦。類中定義的屬性只有傳進了 self 參數(shù)的方法(通常就是實例方法)可訪問。

classmethod

無需實例化鉴裹,但與實例方法第一個參數(shù)必須是 self 類似舞骆,類方法第一個參數(shù)表示類自身的 cls 參數(shù)钥弯,可以來調(diào)用類的屬性、類的方法督禽、類的實例化對象等

a.class_method(2)
A.class_method(2)

觀察上面代碼的運行結(jié)果:

cls <class '__main__.A'>
cls <class '__main__.A'>

可知脆霎,類方法既可以由類調(diào)用,也可以由實例調(diào)用狈惫。

再來看一個例子:

class Book(object):
    def __init__(self, title):
        self.title = title

    @classmethod
    def create(cls, title):
        book = cls(title)
        return book


book1 = Book('A song of Ice and Fire')
book2 = Book.create('The Marvel')
print(book1.title)
print(book2.title)

運行結(jié)果如下:

A song of Ice and Fire
The Marvel

上面睛蛛,類方法創(chuàng)建了一個類實例。

staticmethod

無需 self 參數(shù)胧谈,無需 cls 參數(shù)忆肾,直接聲明一個靜態(tài)方法,可無需實例化菱肖,直接由類調(diào)用客冈,也可實例化后調(diào)用。

帶 staticmethod 裝飾器定義的就是靜態(tài)方法稳强,與普通函數(shù)沒有區(qū)別郊酒,可以不加參數(shù),可以加任意參數(shù)键袱,不必傳入 self 燎窘,既可以由實例調(diào)用,也可以由類調(diào)用蹄咖。

A.static_method()
a.static_method()

運行結(jié)果如下:

this is a static method
this is a static method

總結(jié)

實例方法只能由實例調(diào)用褐健,類方法和靜態(tài)方法可以由實例或類調(diào)用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末澜汤,一起剝皮案震驚了整個濱河市蚜迅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俊抵,老刑警劉巖谁不,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異徽诲,居然都是意外死亡刹帕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門谎替,熙熙樓的掌柜王于貴愁眉苦臉地迎上來偷溺,“玉大人,你說我怎么就攤上這事。” “怎么了鳖谈?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長尉共。 經(jīng)常有香客問我褒傅,道長,這世上最難降的妖魔是什么袄友? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任樊卓,我火速辦了婚禮,結(jié)果婚禮上杠河,老公的妹妹穿的比我還像新娘碌尔。我一直安慰自己,他們只是感情好券敌,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布唾戚。 她就那樣靜靜地躺著,像睡著了一般待诅。 火紅的嫁衣襯著肌膚如雪叹坦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天卑雁,我揣著相機與錄音募书,去河邊找鬼。 笑死测蹲,一個胖子當著我的面吹牛莹捡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扣甲,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼篮赢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了琉挖?” 一聲冷哼從身側(cè)響起启泣,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎示辈,沒想到半個月后寥茫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡矾麻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年纱耻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片射富。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡膝迎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胰耗,到底是詐尸還是另有隱情,我是刑警寧澤芒涡,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布柴灯,位于F島的核電站卖漫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏赠群。R本人自食惡果不足惜羊始,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望查描。 院中可真熱鬧突委,春花似錦、人聲如沸冬三。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勾笆。三九已至敌蚜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窝爪,已是汗流浹背弛车。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蒲每,地道東北人纷跛。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像邀杏,于是被迫代替她去往敵國和親忽舟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學習記錄文檔淮阐,今天18年5月份再次想寫文章叮阅,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,752評論 2 9
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,965評論 6 13
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,100評論 1 32
  • 今天是很不尋常的一天浩姥,今天也是感受另外一種生命的一天。放下了状您,完美放下了勒叠,放下了,別人對自己的評判膏孟,以及別人對自己...
    陳琦不黑閱讀 177評論 0 2
  • 嗨眯分,靜言,今天是2017年的第一天柒桑。2016的你過得怎樣弊决? happy for everyday,just a l...
    jamieT2311閱讀 250評論 0 2