国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - 深入了解Python 方法之類方法 & 靜態(tài)方法

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

2020-08-17 18:43Rocky0429 Python

這篇文章主要介紹了Python類方法 & 靜態(tài)方法的相關(guān)資料,幫助大家更好的理解和學習python,感興趣的朋友可以了解下

寫在之前

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Sample:
 language = "C++"
 def __init__(self):
 self.language = "python"
 
def get_class_attr(cls):
 return cls.language
 
if __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 中,定義了一個屬性 language = “C++”,這個是「類屬性」;在初始化方法中,又定義了 self.language = “python”,這個是「實例屬性」。

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

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

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

?
1
2
3
sample.language:C++
get class attribute:C++
instance attribute:python

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class sample:
 language = "C++"
 def __init__(self):
 self.language = "python"
 
 @classmethod
 def get_class_attr(cls):
 return cls.language
 
if __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())

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

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import random
 
def judge(n):
 num = random.randint(1,100)
 return num - n > 0
 
class 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)系也是因為相互關(guān)聯(lián),所以后期的程序維護可能會出問題,于是為了便于維護,我們同樣對程序進行了修改:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import random
 
class 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 > 0
 
if __name__ == "__main__":
 s = Sample('rocky')
 name = s.get_name(23)
 print(name)

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

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

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

寫在之后

方法是類的重要組成部分,本章所講的類方法和靜態(tài)方法讓我們在使用類的時候有了更加便利的工具。

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

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

The end。

以上就是深入了解Python 方法之類方法 & 靜態(tài)方法的詳細內(nèi)容,更多關(guān)于python 類方法和靜態(tài)方法的資料請關(guān)注服務(wù)器之家其它相關(guān)文章!

原文鏈接:https://cloud.tencent.com/developer/article/1534428

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久久久久网址 | 中文字幕一区二区三区乱码图片 | 亚洲国产区 | 国产偷窥老熟盗摄视频 | 天天碰天天操 | 午夜激情影院 | 亚洲精品粉嫩美女一区 | 精品国产乱码久久久久久1区2区 | 一区二区不卡 | 欧美a在线 | 国产综合一区二区 | 国产欧美日韩在线 | 日韩国产一区二区 | 色婷婷导航 | 99亚洲精品 | 夜夜操比 | 中文字幕亚洲视频 | 日本三级精品视频 | 青青av| 含羞草www网址进入在线观看 | 免费毛片在线 | 亚洲成人精品久久 | www乱| 国产精品久久久久久亚洲调教 | 91精品网 | 亚洲艹 | 国产精品成av人在线视午夜片 | 国产精品自在线 | 亚洲天天操 | 一本黄色片| 亚洲视频免费观看 | 国产精品亚洲视频 | 国产一区二区三区免费视频 | 日韩爱爱免费视频 | 午夜精品久久久久久 | 91国产视频在线 | 欧美日韩国产精品一区二区 | 久久精品这里有 | 国产精品99久久久久久动医院 | 日韩在线欧美 | 久久久久国产一区二区三区四区 |