Python3.0中普通方法、類方法和靜態(tài)方法的比較
一、語法區(qū)別
剛接觸Python中的面向?qū)ο?,對于類方法和靜態(tài)方法難以區(qū)分,通過查找知乎、CSDN論壇,廢了好大的勁思路才逐漸明朗,所以就總結(jié)順便分享一下。
首先開始編輯代碼
# 普通方法、類方法、靜態(tài)方法的比較
# 普通方法、類方法、靜態(tài)方法的比較
class Test:
# 定義類Test的屬性
name = 'python'
content = '人生苦短,我用python!'
def normal_method(self): # 普通方法訪問類Text的屬性
print(self.content)
@classmethod #類方法訪問Test類的屬性,看到@staticmethod我們就知道這個方法并不需要依賴對象本身的狀態(tài)
def class_method(cls):
print(cls.content)
@staticmethod #靜態(tài)方法,無法訪問Test類的屬性,
def static_method():
print('content')
進行測試一
t = Test() t.content = '人生苦短,及時行樂'#設(shè)置對象t的屬性 t.normal_method() t.class_method() t.static_method() # 結(jié)果 人生苦短,及時行樂 人生苦短,我用python! content
使用普通方法、類方法和靜態(tài)方法都可以通過對象(t)進行調(diào)用,但是靜態(tài)方法和類方法無法訪問對象的屬性,所以更改對象(t)的屬性僅僅只是對普通方法起作用。
進行測試二
# Test.content('name')出現(xiàn)錯誤,普通方法無法通過類調(diào)用
Test.class_method()
Test.static_method()
# 結(jié)果
人生苦短,我用python!
content
普通方法無法通過類名調(diào)用,但靜態(tài)方法和類方法是可以的。
總結(jié)
三種方法都可以通過對象進行調(diào)用,但類方法和靜態(tài)方法無法訪問對象屬性,類方法通過對象調(diào)用獲取的仍是類屬性(并非對象屬性);普通方法無法通過類名調(diào)用,類方法和靜態(tài)方法可以,但靜態(tài)方法不能進行訪問,僅僅只是通過傳值得方式(與函數(shù)調(diào)用相同)
二、簡單應(yīng)用
通過上面的示例僅僅只是知道三種方法的語法區(qū)別,下面繼續(xù)看看三種方法的具體應(yīng)用區(qū)別
示例:用類來實現(xiàn)部分計算器功能,并計算任意兩個整數(shù)的平方和
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.靜態(tài)方法(@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.總結(jié)
以上三種方法都能實現(xiàn)示例要求的功能。使用類方法時,求和功能的那部分代碼并沒有放在類(Test)中,而是作為類的一個成員方法,這樣的好處是可以簡化對象,增加可讀性(直接通過參數(shù)num1、num2來實現(xiàn)最終功能),但整個過程仍須類(self)參與;使用靜態(tài)方法時,僅僅需要通過傳遞兩個參數(shù)即可實現(xiàn),單最終結(jié)果仍可作為類方法進行訪問。
5.延伸
@classmethod裝飾(類方法): 它的作用就是有點像靜態(tài)類,比靜態(tài)類不一樣的就是它可以傳進來一個當(dāng)前類作為第一個參數(shù)。
@staticmethod裝飾(靜態(tài)方法):經(jīng)常有一些跟類有關(guān)系的功能但在運行時又不需要實例和類參與的情況下需要用到靜態(tài)方法。 比如更改環(huán)境變量或者修改其他類的屬性等能用到靜態(tài)方法。這種情況可以直接用函數(shù)解決,但這樣同樣會擴散類內(nèi)部的代碼,造成維護困難。至于靜態(tài)方法就是寫在類里的方法,必須用類來調(diào)用(極少數(shù)情況下使用,一般都在全局里直接寫函數(shù)了)。
- Python實例方法、類方法、靜態(tài)方法區(qū)別詳解
- 深入了解Python 方法之類方法 & 靜態(tài)方法
- 解析python 類方法、對象方法、靜態(tài)方法
- Python 面向?qū)ο箪o態(tài)方法、類方法、屬性方法知識點小結(jié)
- Python 靜態(tài)方法和類方法實例分析
- Python 類方法和實例方法(@classmethod),靜態(tài)方法(@staticmethod)原理與用法分析
- Python 實例方法、類方法、靜態(tài)方法的區(qū)別與作用
- Python實例方法、類方法、靜態(tài)方法的區(qū)別與作用詳解
- 深入解析python中的實例方法、類方法和靜態(tài)方法
- Python面向?qū)ο笾o態(tài)屬性、類方法與靜態(tài)方法分析
- 淺談python中的實例方法、類方法和靜態(tài)方法
- 淺談python 類方法/靜態(tài)方法
相關(guān)文章
mac 安裝python網(wǎng)絡(luò)請求包requests方法
今天小編就為大家分享一篇mac 安裝python網(wǎng)絡(luò)請求包requests方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06
python利用不到一百行代碼實現(xiàn)一個小siri
這篇文章主要介紹了關(guān)于python利用不到一百行代碼實現(xiàn)了一個小siri的相關(guān)資料,文中介紹的很詳細(xì),對大家具有一定的參考借鑒價值,需要的朋友們下面來一起看看吧。2017-03-03
Python?Serial串口的簡單數(shù)據(jù)收發(fā)方式
這篇文章主要介紹了Python?Serial串口的簡單數(shù)據(jù)收發(fā)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
簡單了解Django ContentType內(nèi)置組件
這篇文章主要介紹了簡單了解Django ContentType內(nèi)置組件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07
Python+OpenCV目標(biāo)跟蹤實現(xiàn)基本的運動檢測
這篇文章主要為大家詳細(xì)介紹了Python+OpenCV目標(biāo)跟蹤實現(xiàn)基本的運動檢測,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07

