Python面向對象 | 靜態方法 staticmethod

 

靜態方法是類中的函數,不須要實例。靜態方法主要是用來存放邏輯性的代碼,邏輯上屬於類,可是和類自己沒有關係,也就是說在靜態方法中,不會涉及到類中的屬性和方法的操做。能夠理解爲,靜態方法是個獨立的、單純的函數,它僅僅託管於某個類的名稱空間中,便於使用和維護。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靜態方法;字符串

相關文章
相關標籤/搜索