午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁技術(shù)文章
文章詳情頁

深入了解Python 方法之類方法 & 靜態(tài)方法

瀏覽:210日期:2022-07-13 16:50:26

寫在之前

這幾天的閱讀量蜜汁低,是什么原因我也沒搞清楚,如果你們覺得我哪里寫的有問題,或者是哪里不好,歡迎后臺(tái)或者微信告知我,先行謝過。

昨天的文章 詳解類方法之綁定方法與非綁定方法 中寫了方法中的綁定方法和非綁定方法,今天我們繼續(xù)來學(xué)習(xí)剩下的「類方法」和「靜態(tài)方法」。

類方法 & 靜態(tài)方法

在開始之前,先讓我們來看下面一段代碼:

class Sample: language = 'C++' def __init__(self): self.language = 'python'def get_class_attr(cls): return cls.languageif __name__ == '__main__': print('sample.language:',Sample.language) r = get_class_attr(Sample) print('get class attribute:',r) f = Sample() print('instance attribute:',f.language)

上述代碼在類 Sample 中,定義了一個(gè)屬性 language = “C++”,這個(gè)是「類屬性」;在初始化方法中,又定義了 self.language = “python”,這個(gè)是「實(shí)例屬性」。

知道了這個(gè),我們?nèi)缓髞矸治鲆幌潞瘮?shù) get_class_attr(cls),在這個(gè)函數(shù)中參數(shù)用的是 cls,從函數(shù)體來看,要求它引用的對(duì)象應(yīng)該具有屬性 language,這說明,不是隨隨便便哪個(gè)對(duì)象都可以。很巧的是在前面定義的類 Sample 中就有 language 這個(gè)屬性,于是在調(diào)用這個(gè)函數(shù)的時(shí)候,就直接將該類對(duì)象作為方法 get_class_attr() 的參數(shù)。

Sample.language 是要得到類屬性的值,get_class_attr(Sample) 所返回的就是類 Sample 的屬性 Sample.language 的值,所以對(duì)于上述例子來說,前面兩個(gè) print() 函數(shù)打印的結(jié)果應(yīng)該是一樣的。

f = Sample() 則是創(chuàng)建了一個(gè)實(shí)例,然后通過 f.language 訪問實(shí)例屬性。所以對(duì)于上述的代碼的運(yùn)行結(jié)果如下所示:

sample.language:C++get class attribute:C++instance attribute:python

不知道經(jīng)過我上述的解釋你是否明白了,如果沒明白,建議你再仔細(xì)對(duì)比一下上述的運(yùn)行結(jié)果和分析的過程。

在上述的例子中,比較特殊的函數(shù)應(yīng)該是 get_class_attr(cls),它是寫在類的外面的,然而這個(gè)函數(shù)又只能調(diào)用前面寫的那個(gè)類對(duì)象,因?yàn)椴皇撬袑?duì)象都有那個(gè)特別的 language 屬性,這種函數(shù)寫在外面不利于后期的維護(hù),我們應(yīng)該避免這種情況的發(fā)生,而避免的方法就是把函數(shù)和類寫在一起,所以就有了下面這種寫法:

class sample: language = 'C++' def __init__(self): self.language = 'python' @classmethod def get_class_attr(cls): return cls.languageif __name__ == '__main__': print('sample.language:',sample.language) r = sample.get_class_attr() print('get class attribute:',r) f = sample() print('instance attribute:',f.language) print('instance get_class_str:',f.get_class_attr())

在上面這個(gè)修改的代碼中,出現(xiàn)了 @classmethod,這是一個(gè)裝飾器,我們?cè)诤瘮?shù)的那部分講到過。這里需要我們注意的是,@classmethod 所裝飾的方法的參數(shù)中,第一個(gè)參數(shù)不是 self,這個(gè)和我們常規(guī)認(rèn)識(shí)中的類的方法有所區(qū)別。這里使用了參數(shù) cls,這是習(xí)慣的寫法,當(dāng)然用其它的也可以。讓我們來看一下運(yùn)行的結(jié)果:

sample.language:C++get class attribute:C++instance attribute:pythoninstance get_class_str:C++

通過上面的運(yùn)行結(jié)果我們可以看到,不管是通過類還是實(shí)例來執(zhí)行 get_class_attr() 得到的結(jié)果都是類屬性的值,這說明裝飾器 @classmethod 所裝飾的方法,它的參數(shù) cls 引用的對(duì)象是類對(duì)象 Sample。

至此,「類方法」 的定義就出來了:類方法,就是在類里面定義的方法。該方法由裝飾器 @classmethod 裝飾,其第一個(gè)參數(shù) cls 引用的是這個(gè)類對(duì)象,即將類本身作為作為引用對(duì)象傳到這個(gè)方法里。

知道了類方法以后,我們可以用同樣的思路理解另一個(gè)方法 「靜態(tài)方法」,我們還是先來看一段代碼:

import randomdef judge(n): num = random.randint(1,100) return num - n > 0class Sample: def __init__(self,name): self.name = name def get_name(self,age): if judge(age): return self.name else: return 'the name is stupid'if __name__ == '__main__': s = Sample(’rocky’) name = s.get_name(23) print(name)

先看一下上面的代碼,類 Sample 里面使用了外面的函數(shù) judge(n),這種類和函數(shù)的關(guān)系也是因?yàn)橄嗷リP(guān)聯(lián),所以后期的程序維護(hù)可能會(huì)出問題,于是為了便于維護(hù),我們同樣對(duì)程序進(jìn)行了修改:

import randomclass Sample: def __init__(self,name): self.name = name def get_name(self,age): if self.judge(age): return self.name else: return 'the name is stupid' @staticmethod def judge(n): num = random.randint(1,100) return num - n > 0if __name__ == '__main__': s = Sample(’rocky’) name = s.get_name(23) print(name)

同樣是經(jīng)過修改優(yōu)化,將原來在類外面的函數(shù)放到了類里面。但是這不是簡(jiǎn)單的移動(dòng),還要在函數(shù)的前面加上 @staticmethod 裝飾器,并且要注意的是,雖然這個(gè)函數(shù)在類的里面,但是跟別的方法是不一樣的,它的第一個(gè)參數(shù)也不是 self,當(dāng)我們要使用它的時(shí)候,可以通過實(shí)例調(diào)用,比如 self.judge(n),也可以通過類調(diào)用這個(gè)方法,比如 sample.select(n)。

從上面的程序可以看出,盡管 judge(n) 位于類里面,但它確實(shí)一個(gè)獨(dú)立的方法,與類本身沒有關(guān)系,僅僅是為了免除前面所說的后期維護(hù)上的麻煩。但是它也有存在的道理,上面的例子就是一個(gè)典型的說明。

所以「靜態(tài)方法」的定義也就出來了:在類的作用域里面,前面必須要加上一個(gè) @staticmethod 裝飾器,我們將這種方法命名為靜態(tài)方法。

寫在之后

方法是類的重要組成部分,本章所講的類方法和靜態(tài)方法讓我們?cè)谑褂妙惖臅r(shí)候有了更加便利的工具。

「方法」的這一塊到這里就補(bǔ)充完了,之后我們將繼續(xù)學(xué)習(xí) OOP 的剩下兩個(gè)特征:「多態(tài)」和「封裝」,敬請(qǐng)期待。

如果你覺得本篇文章讓你有所收獲,歡迎點(diǎn)贊轉(zhuǎn)發(fā),你的支持是對(duì)我碼字最大的動(dòng)力,分享永遠(yuǎn)在路上,我們一起加油。

The end。

以上就是深入了解Python 方法之類方法 & 靜態(tài)方法的詳細(xì)內(nèi)容,更多關(guān)于python 類方法和靜態(tài)方法的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 欧美色噜噜 | 麻豆视频国产 | 91在线精品观看 | 欧美激情站 | 久久久久国产一区二区三区 | 久久久久一级片 | 性欧美18| 韩日a级片 | 少妇视频一区 | 在线视频99| 在线成人黄色 | av网站免费在线观看 | 久久国产精品久久久 | 91精品国产综合久久久密臀九色 | 国产黄在线 | 一区二区精彩视频 | 黄色免费网站视频 | 午夜精品免费视频 | 蜜桃成人免费视频 | av2014天堂网| 日日干日日草 | 精品视频专区 | 亚洲精品国产精品乱码不卡√香蕉 | 亚洲阿v天堂 | 校园春色亚洲色图 | 日韩最新在线 | 国产一区一区三区 | 99国产精品一区 | 中国精品一区二区 | 成年人二级毛片 | 69午夜| 国产欧美一区二区视频 | 国产一级片在线 | 日韩小视频在线 | 91精品久久久久久久久中文字幕 | 成人免费在线观看 | www五月天 | 国产又黄又爽又无遮挡 | 国产男女猛烈无遮挡在线喷水 | 亚洲三级久久 | 九一精品视频 |