python中@staticmethod方法的使用
python @staticmethod方法
python中@staticmethod方法,類似于C++中的static,方便將外部函數(shù)集成到類體中,主要是可以在不實例化類的情況下直接訪問該方法,如果你去掉staticmethod,在方法中加self也可以通過實例化訪問方法也是可以集成。
class Test:
def __init__(self,num):
self.num = num;
def cout_num(self):
print(self.num)
@staticmethod
def print_num():
print("Hello World")
if __name__ == "__main__":
obj = Test(10)
"""實例化成員方法"""
obj.cout_num()
"""直接訪問靜態(tài)方法"""
Test.print_num()
"""實例化 訪問靜態(tài)方法"""
obj.print_num()輸出結(jié)果
10
Hello World
Hello World
@staticmethod和@classmethod的區(qū)別
一個比較簡單粗暴的區(qū)分方式
要決定是使用@staticmethod還是@classmethod,你必須看看類方法內(nèi)部。如果你的方法訪問了類中的其他變量/方法,那么就使用@classmethod。
另一方面,如果方法沒有接觸到類中的任何其他變量,那么就使用@staticmethod。
其設(shè)計有更深的邏輯聯(lián)系:
classmethod:主要用于替代構(gòu)造函數(shù)。staticmethod:不使用對象的狀態(tài),甚至不使用類本身的結(jié)構(gòu)。它可以是一個類外部的函數(shù)。它只放在類的內(nèi)部,用于分組具有類似功能的函數(shù)(例如,像Java的數(shù)學(xué)類靜態(tài)方法)
示例代碼:
@classmethod Person.printAge = classmethod(Person.printAge) @staticmethod Calculator.add_numbers = staticmethod(Calculator.add_numbers)
能看懂這兩行代碼,應(yīng)該就能理解什么是靜態(tài)方法,什么是類方法了吧。
當(dāng)然,看的不太懂也沒有關(guān)系,下面通過栗子來詳細的解說一下。
類方法@classmethod
什么是類方法?
類方法是綁定到類而不是其對象的方法。
它不需要創(chuàng)建類實例,就像staticmethod 一樣。
靜態(tài)方法 @staticmethod
一般來說,要使用某個類的方法,需要先實例化一個對象再調(diào)用方法。
而使用@staticmethod或@classmethod,就可以不需要實例化,直接類名.方法名()來調(diào)用。
python staticmethod 返回函數(shù)的靜態(tài)方法。
該方法不強制要求傳遞參數(shù),
聲明一個靜態(tài)方法:
class C(object):
@staticmethod
def f(arg1, arg2, ...):
...可以不實例化調(diào)用該方法 C.f()
實現(xiàn)實例化使用 C().f()
什么時候使用@staticmethod
當(dāng)某個方法(函數(shù))不需要用到對象中的任何資源,將這個方法改為一個靜態(tài)方法,
加上@staticmethod;
這個函數(shù)的形參不需要添加 self
加上之后, 這個方法就和普通的函數(shù)沒有什么區(qū)別了, 只不過寫在了一個類中, 可以使用這個類的對象調(diào)用,也可以使用類直接調(diào)用。
區(qū)別
靜態(tài)方法和類方法之間的區(qū)別在于:
靜態(tài)方法對類一無所知,只處理參數(shù)。
類方法適用于類,因為它的參數(shù)始終是類本身。
類方法可以由類及其對象調(diào)用。
Class.classmethod() Class().classmethod()
但無論如何,class方法始終附加到一個類,其中第一個參數(shù)作為類本身,cls。
def classMethod(cls, args…)
五、例子
class Person:
age = 25
def printAge(cls):
print('The age is:', cls.age)
Person.printAge = classmethod(Person.printAge)
Person.printAge()class Person:
age = 25
@classmethod
def printAge(cls):
print('The age is:', cls.age)
Person.printAge()注意:
你會發(fā)現(xiàn)改變了代碼,但是結(jié)果還是一樣的。你細心就會有所發(fā)現(xiàn),沒錯,代碼中的:
****
@classmethod 等價于 Person.printAge = classmethod(Person.printAge)
實例方法可以調(diào)用實例方法、類方法、靜態(tài)方法。
類對象只能調(diào)用類方法、靜態(tài)方法。
classmethod與staticmethod用法類似,classmethod可以通過staticmethod代替,在通過類調(diào)用時,這兩者對于調(diào)用者來說是不可區(qū)分的。這兩者的區(qū)別在于,classmethod增加了一個對實際調(diào)用類的引用。
1.方法可以判斷出自己是通過基類被調(diào)用,還是通過某個子類被調(diào)用
2.通過子類調(diào)用時,方法可以返回子類的實例而非基類的實例
3.通過子類調(diào)用時,方法可以調(diào)用子類的其他classmethod
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python wxauto 庫解鎖微信自動化的無限可能(示例代碼)
wxauto庫是基于Python的一個自動化工具,它主要用于操作和自動化WxPython應(yīng)用程序,這篇文章主要介紹了Python wxauto 庫解鎖微信自動化的無限可能,需要的朋友可以參考下2024-07-07
使用Python實現(xiàn)文本轉(zhuǎn)語音(TTS)并播放音頻
在開發(fā)涉及語音交互或需要語音提示的應(yīng)用時,文本轉(zhuǎn)語音(TTS)技術(shù)是一個非常實用的工具,下面我們來看看如何使用gTTS和playsound庫將文本轉(zhuǎn)換為語音并播放音頻文件吧2025-03-03
Python3將數(shù)據(jù)保存為txt文件的方法
這篇文章主要介紹了Python3將數(shù)據(jù)保存為txt文件的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09
Python+Pygame實戰(zhàn)之24點游戲的實現(xiàn)
這篇文章主要為大家詳細介紹了如何利用Python和Pygame實現(xiàn)24點小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04
Python使用socket模塊實現(xiàn)簡單tcp通信
這篇文章主要介紹了Python使用socket模塊實現(xiàn)簡單tcp通信,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08

