靜態方法是類中的函數,不須要實例。靜態方法主要是用來存放邏輯性的代碼,邏輯上屬於類,可是和類自己沒有關係,也就是說在靜態方法中,不會涉及到類中的屬性和方法的操做。能夠理解爲,靜態方法是個獨立的、單純的函數,它僅僅託管於某個類的名稱空間中,便於使用和維護。python
譬如,我想定義一個關於時間操做的類,其中有一個獲取當前時間的函數。使用了靜態方法,然而方法體中並沒使用(也不能使用)類或實例的屬性(或方法)。若要得到當前時間的字符串時,並不必定須要實例化對象,此時對於靜態方法而言,所在類更像是一種名稱空間。其實,咱們也能夠在類外面寫一個一樣的函數來作這些事,可是這樣作就打亂了邏輯關係,也會致使之後代碼維護困難。編程
import time class TimeTest(object): def __init__(self, hour, minute, second): self.hour = hour self.minute = minute self.second = second # 各類方法省略 @staticmethod # 靜態方法 def showTime(): return time.strftime("%H:%M:%S", time.localtime()) print(TimeTest.showTime()) t = TimeTest(2, 10, 10) print(t.showTime()) ''' 執行輸出: 21:05:43 21:05:43 '''
看下面代碼,一半是面向過程,一半是面向對象。對於徹底面向對象編程而言,不容許出現面向過程的代碼。徹底面向對象編程。先登陸後實例化。尚未一個具體的對象的時候 就要執行login方法,這樣是不合理的。須要將login()變成靜態方法。函數
def login():pass #username #password #身份 -- 實例化 class Student: def __init__(self,name):pass def login(self):pass
python爲咱們內置了函數staticmethod來把類中的函數定義成靜態方法,它不須要實例化。因此,連self參數都沒有。spa
class Student: def __init__(self,name):pass @staticmethod def login(): # login就是一個類中的靜態方法.靜態方法沒有默認參數,就當成普通的函數使用便可 user = input('user :') if user == 'Tony': print('success') else: print('faild') Student.login()
總結:code
當一個方法要使用對象的屬性時就是用普通的方法;對象
當一個方法要使用類中的靜態屬性時,就是用類方法(classmethod);blog
當一個方法要既不使用對象的屬性也不使用類中的靜態屬性時,就可使用staticmethod靜態方法;字符串