python靜態(tài)函數(shù) Python 靜態(tài)函數(shù)

Python中靜態(tài)方法和類方法的區(qū)別是什么'>lt;譯文>Python中靜態(tài)方法和類方法的區(qū)別是什么

要在類中使用靜態(tài)方法,需在類成員函數(shù)前面加上@staticmethod標(biāo)記符,以表示下面的成員函數(shù)是靜態(tài)函數(shù)。使用靜態(tài)方法的好處是,不需要定義實(shí)例即可使用這個(gè)方法。另外,多個(gè)實(shí)例共享此靜態(tài)方法。

公司主營業(yè)務(wù):網(wǎng)站建設(shè)、成都做網(wǎng)站、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出錫林郭勒盟免費(fèi)做網(wǎng)站回饋大家。

普通的類方法需要對象實(shí)例化之后才能調(diào)用 。

如何在Python中定義靜態(tài)變量

Python使用函數(shù)默認(rèn)值實(shí)現(xiàn)函數(shù)靜態(tài)變量的方法,具體方法如下:

一、Python函數(shù)默認(rèn)值

Python函數(shù)默認(rèn)值的使用可以在函數(shù)調(diào)用時(shí)寫代碼提供方便,很多時(shí)候我們只要使用默認(rèn)值就可以了。 所以函數(shù)默認(rèn)值在python中用到的很多,尤其是在類中間,類的初始化函數(shù)中一幫都會(huì)用到默認(rèn)值。 使用類時(shí)能夠方便的創(chuàng)建類,而不需要傳遞一堆參數(shù)。

只要在函數(shù)參數(shù)名后面加上 ”=defalut_value”,函數(shù)默認(rèn)值就定義好了。有一個(gè)地方需要注意的是,有默認(rèn)值的參數(shù)必須在函數(shù)參數(shù)列表的最后,不允許將沒有默認(rèn)值的參數(shù)放在有默認(rèn)值的參數(shù)后,因?yàn)槿绻隳菢佣x的話,解釋器將不知道如何去傳遞參數(shù)。

先來看一段示例代碼:

def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):

while True:

ok = raw_input(prompt)

if ok in ('y', 'ye', 'yes'): return True

if ok in ('n', 'no', 'nop', 'nope'): return False

retries = retries - 1

if retries 0: raise IOError, 'refusenik user'

print complaint

你調(diào)用上面的函數(shù)時(shí),可以修改重試次數(shù)和輸出的提示語言,如果你比較懶得話,那么什么都不用改。

二、python使用函數(shù)默認(rèn)值來實(shí)現(xiàn)函數(shù)靜態(tài)變量的功能

Python中是不支持靜態(tài)變量的,但是我們可以通過函數(shù)的默認(rèn)值來實(shí)現(xiàn)靜態(tài)變量的功能。

當(dāng)函數(shù)的默認(rèn)值是內(nèi)容是可變的類時(shí),類的內(nèi)容可變,而類的名字沒變。(相當(dāng)于開辟的內(nèi)存區(qū)域沒有變,而其中內(nèi)容可以變化)。

這是因?yàn)閜ython中函數(shù)的默認(rèn)值只會(huì)被執(zhí)行一次,(和靜態(tài)變量一樣,靜態(tài)變量初始化也是被執(zhí)行一次。)這就是他們的共同點(diǎn)。

再來看下面的程序片段:

def f(a, L=[]):

L.append(a)

return L

print f(1)

print f(2)

print f(3)

print f(4,['x'])

print f(5)

其輸出結(jié)果是:

[1]

[1, 2]

[1, 2, 3]

['x', 4]

[1, 2, 3, 5]

前面的好理解,為什么最后 “print f(5)”的輸出是 “[1, 2, 3, 5]”呢?

這是因?yàn)?“print f(4,['x'])”時(shí),默認(rèn)變量并沒有被改變,因?yàn)槟J(rèn)變量的初始化只是被執(zhí)行了一次(第一次使用默認(rèn)值調(diào)用),初始化執(zhí)行開辟的內(nèi)存區(qū)(我們可以稱之為默認(rèn)變量)沒有被改變,所以最后的輸出結(jié)果是“[1, 2, 3, 5]”。

python 類方法和靜態(tài)方法的區(qū)別

面相對象程序設(shè)計(jì)中,類方法和靜態(tài)方法是經(jīng)常用到的兩個(gè)術(shù)語。

邏輯上講:類方法是只能由類名調(diào)用;靜態(tài)方法可以由類名或?qū)ο竺M(jìn)行調(diào)用。

在C++中,靜態(tài)方法與類方法邏輯上是等價(jià)的,只有一個(gè)概念,不會(huì)混淆。

而在python中,方法分為三類實(shí)例方法、類方法、靜態(tài)方法。代碼如下:

 class Test(object):

def InstanceFun(self):

print("InstanceFun");

print(self);

@classmethod

def ClassFun(cls):

print("ClassFun");

print(cls);

@staticmethod

def StaticFun():

print("StaticFun");

t = Test(); 

t.InstanceFun();# 輸出InstanceFun,打印對象內(nèi)存地址“__main__.Test object at 0x0293DCF0”

Test.ClassFun(); # 輸出ClassFun,打印類位置 class '__main__.Test'

Test.StaticFun(); # 輸出StaticFun

t.StaticFun(); # 輸出StaticFun

t.ClassFun(); # 輸出ClassFun,打印類位置 class '__main__.Test'

Test.InstanceFun(); # 錯(cuò)誤,TypeError: unbound method instanceFun() must be called with Test instance as first argument

Test.InstanceFun(t); # 輸出InstanceFun,打印對象內(nèi)存地址“__main__.Test object at 0x0293DCF0”

t.ClassFun(Test); # 錯(cuò)誤 classFun() takes exactly 1 argument (2 given)

可以看到,在python中,兩種方法的主要區(qū)別在于參數(shù)。實(shí)例方法隱含的參數(shù)為類實(shí)例self,而類方法隱含的參數(shù)為類本身cls。

靜態(tài)方法無隱含參數(shù),主要為了類實(shí)例也可以直接調(diào)用靜態(tài)方法。

所以邏輯上類方法應(yīng)當(dāng)只被類調(diào)用,實(shí)例方法實(shí)例調(diào)用,靜態(tài)方法兩者都能調(diào)用。主要區(qū)別在于參數(shù)傳遞上的區(qū)別,實(shí)例方法悄悄傳遞的是self引用作為參數(shù),而類方法悄悄傳遞的是cls引用作為參數(shù)。

python實(shí)現(xiàn)了一定的靈活性使得類方法和靜態(tài)方法,都能夠被實(shí)例和類二者調(diào)用

python 為什么要使用靜態(tài)方法

Python使用靜態(tài)方法類似函數(shù)工具使用,一般盡量少用靜態(tài)方法。

Python的靜態(tài)方法和類成員方法都可以被類或?qū)嵗L問,兩者概念不容易理清,但還是有區(qū)別的:

1)靜態(tài)方法無需傳入self參數(shù),類成員方法需傳入代表本類的cls參數(shù);

2)從第1條,靜態(tài)方法是無法訪問實(shí)例變量的,而類成員方法也同樣無法訪問實(shí)例變量,但可以訪問類變量;

3)靜態(tài)方法有點(diǎn)像函數(shù)工具庫的作用,而類成員方法則更接近類似Java面向?qū)ο蟾拍钪械撵o態(tài)方法。

3種python3的canny邊緣檢測之靜態(tài),可調(diào)節(jié)和自適應(yīng)

先看高級(jí)版的python3的canny的自適應(yīng)邊緣檢測:

內(nèi)容:

1 canny的邊緣檢測的介紹。

2 三種方法的canny的邊緣檢測,由淺入深地介紹:固定值的靜態(tài),可自調(diào)節(jié)的,自適應(yīng)的。

說明:

1 環(huán)境:python3.8、opencv4.5.3和matplotlib3.4.3。

2 圖片:來自品閱網(wǎng)正版免費(fèi)圖庫。

3 實(shí)現(xiàn)自適應(yīng)閾值的canny邊緣檢測的參考代碼和文章:

上述的代碼,本機(jī)均有報(bào)錯(cuò),故對代碼進(jìn)行修改,注釋和運(yùn)行。

初級(jí)canny:

1 介紹:opencv中給出了canny邊緣檢測的接口,直接調(diào)用:

即可得到邊緣檢測的結(jié)果ret,其中,t1,t2是需要人為設(shè)置的閾值。

2 python的opencv的一行代碼即可實(shí)現(xiàn)邊緣檢測。

3 Canny函數(shù)及使用:

4 Canny邊緣檢測流程:

去噪 -- 梯度 -- 非極大值抑制 -- 滯后閾值

5 代碼:

6 操作和過程:

7 原圖:

8 疑問:

ret = cv2.canny(img,t1,t2),其中,t1,t2是需要人為設(shè)置的閾值,一般人怎么知道具體數(shù)值是多少,才是最佳的呀?所以,這是它的缺點(diǎn)。

中級(jí)canny:

1 中級(jí)canny,就是可調(diào)節(jié)的閾值,找到最佳的canny邊緣檢測效果。

2 采用cv2.createTrackbar來調(diào)節(jié)閾值。

3 代碼:

4 操作和效果:

5 原圖:

高級(jí)canny:

1 自適應(yīng)canny的算法:

ret = cv2.canny(img,t1,t2)

即算法在運(yùn)行過程中能夠自適應(yīng)地找到較佳的分割閾值t1,t2。

2 文件結(jié)構(gòu):

3 main.py代碼:

4 dog.py代碼:

5 bilateralfilt.py代碼:

6 原圖:

7 效果圖:本文第一個(gè)gif圖,此處省略。

小結(jié):

1 本文由淺入深,總結(jié)的很好,適合收藏。

2 對于理解python的opencv的canny的邊緣檢測,很有幫助。

3 本文高級(jí)版canny自適應(yīng)的算法參考2篇文章,雖然我進(jìn)行代碼的刪除,注釋,修改,優(yōu)化等操作,故我不標(biāo)注原創(chuàng),對原作者表達(dá)敬意。

4 自己總結(jié)和整理,分享出來,希望對大家有幫助。

Python中靜態(tài)方法和類方法的區(qū)別

一、先是在語法上面的區(qū)別:

1、靜態(tài)方法不需要傳入self參數(shù),類成員方法需要傳入代表本類的cls參數(shù);

2、靜態(tài)方法是無妨訪問實(shí)例變量和類變量的,類成員方法無法訪問實(shí)例變量但是可以訪問類變量

二、使用的區(qū)別:

由于靜態(tài)方法無法訪問類屬性,實(shí)例屬性,相當(dāng)于一個(gè)相對獨(dú)立的方法,跟類其實(shí)并沒有什么關(guān)系。這樣說來,靜態(tài)方法就是在類的作用域里的函數(shù)而已。

網(wǎng)站題目:python靜態(tài)函數(shù) Python 靜態(tài)函數(shù)
轉(zhuǎn)載注明:http://www.muchs.cn/article10/doodddo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司、微信小程序、云服務(wù)器網(wǎng)站排名、定制開發(fā)、

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)