您好,登錄后才能下訂單哦!
小編給大家分享一下Python中類方法和靜態方法是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
類方法 & 靜態方法
在開始之前,先讓我們來看下面一段代碼:
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”,這個是「實例屬性」。
知道了這個,我們然后來分析一下函數 get_class_attr(cls),在這個函數中參數用的是 cls,從函數體來看,要求它引用的對象應該具有屬性 language,這說明,不是隨隨便便哪個對象都可以。很巧的是在前面定義的類 Sample 中就有 language 這個屬性,于是在調用這個函數的時候,就直接將該類對象作為方法 get_class_attr() 的參數。
Sample.language 是要得到類屬性的值,get_class_attr(Sample) 所返回的就是類 Sample 的屬性 Sample.language 的值,所以對于上述例子來說,前面兩個 print() 函數打印的結果應該是一樣的。
f = Sample() 則是創建了一個實例,然后通過 f.language 訪問實例屬性。所以對于上述的代碼的運行結果如下所示:
sample.language:C++ get class attribute:C++ instance attribute:python
不知道經過我上述的解釋你是否明白了,如果沒明白,建議你再仔細對比一下上述的運行結果和分析的過程。
在上述的例子中,比較特殊的函數應該是 get_class_attr(cls),它是寫在類的外面的,然而這個函數又只能調用前面寫的那個類對象,因為不是所有對象都有那個特別的 language 屬性,這種函數寫在外面不利于后期的維護,我們應該避免這種情況的發生,而避免的方法就是把函數和類寫在一起,所以就有了下面這種寫法:
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())
在上面這個修改的代碼中,出現了 @classmethod,這是一個裝飾器,我們在函數的那部分講到過。這里需要我們注意的是,@classmethod 所裝飾的方法的參數中,第一個參數不是 self,這個和我們常規認識中的類的方法有所區別。這里使用了參數 cls,這是習慣的寫法,當然用其它的也可以。讓我們來看一下運行的結果:
sample.language:C++
get class attribute:C++
instance attribute:python
instance get_class_str:C++
通過上面的運行結果我們可以看到,不管是通過類還是實例來執行 get_class_attr() 得到的結果都是類屬性的值,這說明裝飾器 @classmethod 所裝飾的方法,它的參數 cls 引用的對象是類對象 Sample。
至此,「類方法」 的定義就出來了:類方法,就是在類里面定義的方法。該方法由裝飾器 @classmethod 裝飾,其第一個參數 cls 引用的是這個類對象,即將類本身作為作為引用對象傳到這個方法里。
知道了類方法以后,我們可以用同樣的思路理解另一個方法 「靜態方法」,我們還是先來看一段代碼:
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 里面使用了外面的函數 judge(n),這種類和函數的關系也是因為相互關聯,所以后期的程序維護可能會出問題,于是為了便于維護,我們同樣對程序進行了修改:
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)
同樣是經過修改優化,將原來在類外面的函數放到了類里面。但是這不是簡單的移動,還要在函數的前面加上 @staticmethod 裝飾器,并且要注意的是,雖然這個函數在類的里面,但是跟別的方法是不一樣的,它的第一個參數也不是 self,當我們要使用它的時候,可以通過實例調用,比如 self.judge(n),也可以通過類調用這個方法,比如 sample.select(n)。
從上面的程序可以看出,盡管 judge(n) 位于類里面,但它確實一個獨立的方法,與類本身沒有關系,僅僅是為了免除前面所說的后期維護上的麻煩。但是它也有存在的道理,上面的例子就是一個典型的說明。
所以「靜態方法」的定義也就出來了:在類的作用域里面,前面必須要加上一個 @staticmethod 裝飾器,我們將這種方法命名為靜態方法。
方法是類的重要組成部分,本章所講的類方法和靜態方法讓我們在使用類的時候有了更加便利的工具。
以上是Python中類方法和靜態方法是什么的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。