Python面向物件 | 靜態方法 staticmethod
阿新 • • 發佈:2019-11-16
靜態方法是類中的函式,不需要例項。靜態方法主要是用來存放邏輯性的程式碼,邏輯上屬於類,但是和類本身沒有關係,也就是說在靜態方法中,不會涉及到類中的屬性和方法的操作。可以理解為,靜態方法是個獨立的、單純的函式,它僅僅託管於某個類的名稱空間中,便於使用和維護。
譬如,我想定義一個關於時間操作的類,其中有一個獲取當前時間的函式。使用了靜態方法,然而方法體中並沒使用(也不能使用)類或例項的屬性(或方法)。若要獲得當前時間的字串時,並不一定需要例項化物件,此時對於靜態方法而言,所在類更像是一種名稱空間。其實,我們也可以在類外面寫一個同樣的函式來做這些事,但是這樣做就打亂了邏輯關係,也會導致以後程式碼維護困難。
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引數都沒有。
class Student: def __init__(self,name):pass @staticmethod def login(): # login就是一個類中的靜態方法.靜態方法沒有預設引數,就當成普通的函式使用即可 user = input('user :') if user == 'Tony': print('success') else: print('faild') Student.login()
總結:
-
當一個方法要使用物件的屬性時就是用普通的方法;
-
當一個方法要使用類中的靜態屬性時,就是用類方法(classmethod);
-
當一個方法要既不使用物件的屬性也不使用類中的靜態屬性時,就可以使用staticmethod靜態方法;