python中@staticmethod方法的使用
python @staticmethod方法
python中@staticmethod方法,類(lèi)似于C++中的static,方便將外部函數(shù)集成到類(lèi)體中,主要是可以在不實(shí)例化類(lèi)的情況下直接訪問(wèn)該方法,如果你去掉staticmethod,在方法中加self也可以通過(guò)實(shí)例化訪問(wèn)方法也是可以集成。
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)
"""實(shí)例化成員方法"""
obj.cout_num()
"""直接訪問(wèn)靜態(tài)方法"""
Test.print_num()
"""實(shí)例化 訪問(wèn)靜態(tài)方法"""
obj.print_num()輸出結(jié)果
10
Hello World
Hello World
@staticmethod和@classmethod的區(qū)別
一個(gè)比較簡(jiǎn)單粗暴的區(qū)分方式
要決定是使用@staticmethod還是@classmethod,你必須看看類(lèi)方法內(nèi)部。如果你的方法訪問(wèn)了類(lèi)中的其他變量/方法,那么就使用@classmethod。
另一方面,如果方法沒(méi)有接觸到類(lèi)中的任何其他變量,那么就使用@staticmethod。
其設(shè)計(jì)有更深的邏輯聯(lián)系:
classmethod:主要用于替代構(gòu)造函數(shù)。staticmethod:不使用對(duì)象的狀態(tài),甚至不使用類(lèi)本身的結(jié)構(gòu)。它可以是一個(gè)類(lèi)外部的函數(shù)。它只放在類(lèi)的內(nèi)部,用于分組具有類(lèi)似功能的函數(shù)(例如,像Java的數(shù)學(xué)類(lèi)靜態(tài)方法)
示例代碼:
@classmethod Person.printAge = classmethod(Person.printAge) @staticmethod Calculator.add_numbers = staticmethod(Calculator.add_numbers)
能看懂這兩行代碼,應(yīng)該就能理解什么是靜態(tài)方法,什么是類(lèi)方法了吧。
當(dāng)然,看的不太懂也沒(méi)有關(guān)系,下面通過(guò)栗子來(lái)詳細(xì)的解說(shuō)一下。
類(lèi)方法@classmethod
什么是類(lèi)方法?
類(lèi)方法是綁定到類(lèi)而不是其對(duì)象的方法。
它不需要?jiǎng)?chuàng)建類(lèi)實(shí)例,就像staticmethod 一樣。
靜態(tài)方法 @staticmethod
一般來(lái)說(shuō),要使用某個(gè)類(lèi)的方法,需要先實(shí)例化一個(gè)對(duì)象再調(diào)用方法。
而使用@staticmethod或@classmethod,就可以不需要實(shí)例化,直接類(lèi)名.方法名()來(lái)調(diào)用。
python staticmethod 返回函數(shù)的靜態(tài)方法。
該方法不強(qiáng)制要求傳遞參數(shù),
聲明一個(gè)靜態(tài)方法:
class C(object):
@staticmethod
def f(arg1, arg2, ...):
...可以不實(shí)例化調(diào)用該方法 C.f()
實(shí)現(xiàn)實(shí)例化使用 C().f()
什么時(shí)候使用@staticmethod
當(dāng)某個(gè)方法(函數(shù))不需要用到對(duì)象中的任何資源,將這個(gè)方法改為一個(gè)靜態(tài)方法,
加上@staticmethod;
這個(gè)函數(shù)的形參不需要添加 self
加上之后, 這個(gè)方法就和普通的函數(shù)沒(méi)有什么區(qū)別了, 只不過(guò)寫(xiě)在了一個(gè)類(lèi)中, 可以使用這個(gè)類(lèi)的對(duì)象調(diào)用,也可以使用類(lèi)直接調(diào)用。
區(qū)別
靜態(tài)方法和類(lèi)方法之間的區(qū)別在于:
靜態(tài)方法對(duì)類(lèi)一無(wú)所知,只處理參數(shù)。
類(lèi)方法適用于類(lèi),因?yàn)樗膮?shù)始終是類(lèi)本身。
類(lèi)方法可以由類(lèi)及其對(duì)象調(diào)用。
Class.classmethod() Class().classmethod()
但無(wú)論如何,class方法始終附加到一個(gè)類(lèi),其中第一個(gè)參數(shù)作為類(lèi)本身,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()注意:
你會(huì)發(fā)現(xiàn)改變了代碼,但是結(jié)果還是一樣的。你細(xì)心就會(huì)有所發(fā)現(xiàn),沒(méi)錯(cuò),代碼中的:
****
@classmethod 等價(jià)于 Person.printAge = classmethod(Person.printAge)
實(shí)例方法可以調(diào)用實(shí)例方法、類(lèi)方法、靜態(tài)方法。
類(lèi)對(duì)象只能調(diào)用類(lèi)方法、靜態(tài)方法。
classmethod與staticmethod用法類(lèi)似,classmethod可以通過(guò)staticmethod代替,在通過(guò)類(lèi)調(diào)用時(shí),這兩者對(duì)于調(diào)用者來(lái)說(shuō)是不可區(qū)分的。這兩者的區(qū)別在于,classmethod增加了一個(gè)對(duì)實(shí)際調(diào)用類(lèi)的引用。
1.方法可以判斷出自己是通過(guò)基類(lèi)被調(diào)用,還是通過(guò)某個(gè)子類(lèi)被調(diào)用
2.通過(guò)子類(lèi)調(diào)用時(shí),方法可以返回子類(lèi)的實(shí)例而非基類(lèi)的實(shí)例
3.通過(guò)子類(lèi)調(diào)用時(shí),方法可以調(diào)用子類(lèi)的其他classmethod
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python如何實(shí)現(xiàn)macOS系統(tǒng)代理的設(shè)置
這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)macOS系統(tǒng)代理的設(shè)置,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-01-01
利用Python腳本實(shí)現(xiàn)ping百度和google的方法
最近在做SEO的時(shí)候,為了讓發(fā)的外鏈能夠快速的收錄,想到了利用ping的功能,google和百度都有相關(guān)的ping介紹,有興趣的朋友可以去看看相關(guān)的知識(shí)。下面這篇文章主要介紹了利用Python腳本實(shí)現(xiàn)ping百度和google的方法,需要的朋友可以參考借鑒,一起來(lái)看看吧。2017-01-01
python使用epoll實(shí)現(xiàn)服務(wù)端的方法
今天小編就為大家分享一篇python使用epoll實(shí)現(xiàn)服務(wù)端的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10
Python面向?qū)ο蟪绦蛟O(shè)計(jì)OOP入門(mén)教程【類(lèi),實(shí)例,繼承,重載等】
這篇文章主要介紹了Python面向?qū)ο蟪绦蛟O(shè)計(jì)OOP入門(mén)教程,較為詳細(xì)的分析了Python面向?qū)ο箢?lèi),實(shí)例,繼承,重載等相關(guān)概念與使用技巧,需要的朋友可以參考下2019-01-01
Python的經(jīng)緯度與xy坐標(biāo)系相互轉(zhuǎn)換方式
這篇文章主要介紹了Python的經(jīng)緯度與xy坐標(biāo)系相互轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
Python一行代碼識(shí)別車(chē)牌號(hào)碼實(shí)現(xiàn)示例詳解
這篇文章主要為大家介紹了Python一行代碼識(shí)別車(chē)牌號(hào)碼實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Python實(shí)戰(zhàn)之能監(jiān)控文件變化的神器—看門(mén)狗
這篇文章主要介紹了Python實(shí)戰(zhàn)之能監(jiān)控文件變化的神器—看門(mén)狗,文中有非常詳細(xì)的圖文及代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-05-05

