1. 程式人生 > >Python面向物件 | 靜態方法 staticmethod

Python面向物件 | 靜態方法 staticmethod

 

靜態方法是類中的函式,不需要例項。靜態方法主要是用來存放邏輯性的程式碼,邏輯上屬於類,但是和類本身沒有關係,也就是說在靜態方法中,不會涉及到類中的屬性和方法的操作。可以理解為,靜態方法是個獨立的、單純的函式,它僅僅託管於某個類的名稱空間中,便於使用和維護。

 

譬如,我想定義一個關於時間操作的類,其中有一個獲取當前時間的函式。使用了靜態方法,然而方法體中並沒使用(也不能使用)類或例項的屬性(或方法)。若要獲得當前時間的字串時,並不一定需要例項化物件,此時對於靜態方法而言,所在類更像是一種名稱空間。其實,我們也可以在類外面寫一個同樣的函式來做這些事,但是這樣做就打亂了邏輯關係,也會導致以後程式碼維護困難。

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靜態方法;