參考鏈接: Python中的類方法與靜態方法
一、語法區別
?
? ? ? ?剛接觸Python中的面向對象,對于類方法和靜態方法難以區分,通過查找知乎、CSDN論壇,廢了好大的勁思路才逐漸明朗,所以就總結順便分享一下。
?
首先開始編輯代碼
# 普通方法、類方法、靜態方法的比較
# 普通方法、類方法、靜態方法的比較
class Test:
? ? # 定義類Test的屬性
? ? name = 'python'
? ? content = '人生苦短,我用python!'
? ? def normal_method(self): # 普通方法訪問類Text的屬性
? ? ? ? print(self.content)
? ? @classmethod? #類方法訪問Test類的屬性,看到@staticmethod我們就知道這個方法并不需要依賴對象本身的狀態
? ? def class_method(cls):
? ? ? ? print(cls.content)
? ? @staticmethod? #靜態方法,無法訪問Test類的屬性,
? ? def static_method():
? ? ? ? print('content')
?
進行測試一
t = Test()
t.content = '人生苦短,及時行樂'#設置對象t的屬性
?
t.normal_method()
t.class_method()
t.static_method()
?
# 結果
人生苦短,及時行樂
人生苦短,我用python!
content
使用普通方法、類方法和靜態方法都可以通過對象(t)進行調用,但是靜態方法和類方法無法訪問對象的屬性,所以更改對象(t)的屬性僅僅只是對普通方法起作用。
?
進行測試二
# Test.content('name')出現錯誤,普通方法無法通過類調用
Test.class_method()
Test.static_method()
# 結果
人生苦短,我用python!
content
? ?普通方法無法通過類名調用,但靜態方法和類方法是可以的。
?
總結
?
? ? ? ? 三種方法都可以通過對象進行調用,但類方法和靜態方法無法訪問對象屬性,類方法通過對象調用獲取的仍是類屬性(并非對象屬性);普通方法無法通過類名調用,類方法和靜態方法可以,但靜態方法不能進行訪問,僅僅只是通過傳值得方式(與函數調用相同)
?
二、簡單應用
?
通過上面的示例僅僅只是知道三種方法的語法區別,下面繼續看看三種方法的具體應用區別
?
示例:用類來實現部分計算器功能,并計算任意兩個整數的平方和
?
1. 普通方法
class Test:
? ? def __init__(self, num1, num2):
? ? ? ? self.num1 = num1
? ? ? ? self.num2 = num2
? ? def plus(self):
? ? ? ? result = self.num1 + self.num2
? ? ? ? return result
? ? def multiply(self):
? ? ? ? result = self.num1 * self.num2
? ? ? ? return result
t1 = Test(3, 3)
m = t1.multiply()
t2 = Test(4, 4)
n = t2.multiply()
t3 =Test(m, n)
sum = t3.plus()
print(sum)
?
2. 類方法(@classnethod)
class Test:
? ? def __init__(self, num1, num2):
? ? ? ? self.num1 = num1
? ? ? ? self.num2 = num2
? ? def plus(self):
? ? ? ? result = self.num1 + self.num2
? ? ? ? return result
? ? def multiply(self):
? ? ? ? result = self.num1 * self.num2
? ? ? ? return result
? ? @classmethod
? ? def sum(cls, num1, num2):
? ? ? ? t1 = Test(3, 3)
? ? ? ? m = t1.multiply()
? ? ? ? t2 = Test(4, 4)
? ? ? ? n = t2.multiply()
? ? ? ? t3 = Test(m, n)
? ? ? ? print(t3.plus())
Test.sum(3, 4)
3.靜態方法(@staticmethod)
class Test:
? ? def __init__(self, num1, num2):
? ? ? ? self.num1 = num1
? ? ? ? self.num2 = num2
? ? def plus(self):
? ? ? ? result = self.num1 + self.num2
? ? ? ? return result
? ? def multiply(self):
? ? ? ? result = self.num1 * self.num2
? ? ? ? return result
? ? @staticmethod
? ? def sum(num1, num2):
? ? ? ? s = num1 * num1 + num2 * num2
? ? ? ? print(s)
Test.sum(3, 4)
?
4.總結
?
?
? ? ? ?以上三種方法都能實現示例要求的功能。使用類方法時,求和功能的那部分代碼并沒有放在類(Test)中,而是作為類的一個成員方法,這樣的好處是可以簡化對象,增加可讀性(直接通過參數num1、num2來實現最終功能),但整個過程仍須類(self)參與;使用靜態方法時,僅僅需要通過傳遞兩個參數即可實現,單最終結果仍可作為類方法進行訪問。
?
?
5.延伸
?
?
? ? ? ?@classmethod裝飾(類方法): 它的作用就是有點像靜態類,比靜態類不一樣的就是它可以傳進來一個當前類作為第一個參數。
?
? ? ? ?@staticmethod裝飾(靜態方法):經常有一些跟類有關系的功能但在運行時又不需要實例和類參與的情況下需要用到靜態方法。 比如更改環境變量或者修改其他類的屬性等能用到靜態方法。這種情況可以直接用函數解決,但這樣同樣會擴散類內部的代碼,造成維護困難。至于靜態方法就是寫在類里的方法,必須用類來調用(極少數情況下使用,一般都在全局里直接寫函數了)。