靜態方法python
Ⅰ python裡面的靜態方法是不是不能遞歸
在類裡面定義的函數就是方法,類方法需要@ classmethod 修飾並且有個隱藏參數 cls,實例方法必須有個參數 self, 靜態方法必須有 @staticmethod修飾,類和實例都可以訪問靜態方法,實例可以訪問實例方法也可以訪問類方法
類可以訪問類方法也可以訪問實例方法,訪問實例方法必須要帶參數 self, 可以理解為類其實也是一個實例,類訪問實例方法不帶參數會報錯的.類本身可以訪問函數,實例卻不行.
Ⅱ 3種python3的canny邊緣檢測之靜態,可調節和自適應
先看高級版的python3的canny的自適應邊緣檢測:
內容:
1 canny的邊緣檢測的介紹。
2 三種方法的canny的邊緣檢測,由淺入深地介紹:固定值的靜態,可自調節的,自適應的。
說明:
1 環境:python3.8、opencv4.5.3和matplotlib3.4.3。
2 圖片:來自品閱網正版免費圖庫。
3 實現自適應閾值的canny邊緣檢測的參考代碼和文章:
上述的代碼,本機均有報錯,故對代碼進行修改,注釋和運行。
初級canny:
1 介紹:opencv中給出了canny邊緣檢測的介面,直接調用:
即可得到邊緣檢測的結果ret,其中,t1,t2是需要人為設置的閾值。
2 python的opencv的一行代碼即可實現邊緣檢測。
3 Canny函數及使用:
4 Canny邊緣檢測流程:
去噪 --> 梯度 --> 非極大值抑制 --> 滯後閾值
5 代碼:
6 操作和過程:
7 原圖:
8 疑問:
ret = cv2.canny(img,t1,t2),其中,t1,t2是需要人為設置的閾值,一般人怎麼知道具體數值是多少,才是最佳的呀?所以,這是它的缺點。
中級canny:
1 中級canny,就是可調節的閾值,找到最佳的canny邊緣檢測效果。
2 採用cv2.createTrackbar來調節閾值。
3 代碼:
4 操作和效果:
5 原圖:
高級canny:
1 自適應canny的演算法:
ret = cv2.canny(img,t1,t2)
即演算法在運行過程中能夠自適應地找到較佳的分割閾值t1,t2。
2 文件結構:
3 main.py代碼:
4 dog.py代碼:
5 bilateralfilt.py代碼:
6 原圖:
7 效果圖:本文第一個gif圖,此處省略。
小結:
1 本文由淺入深,總結的很好,適合收藏。
2 對於理解python的opencv的canny的邊緣檢測,很有幫助。
3 本文高級版canny自適應的演算法參考2篇文章,雖然我進行代碼的刪除,注釋,修改,優化等操作,故我不標注原創,對原作者表達敬意。
4 自己總結和整理,分享出來,希望對大家有幫助。
Ⅲ python 如何調用類的方法
以numpy為例,首先創建一個對象:
In[32]:a=numpp.arange(10)
然後,a就擁有了類的方法,例如求和:
In[33]:a.sum()
Out[33]:45
也可以使用類的方法,將其應用到類的對象上,例如:
In[34]:numpp.sum(a)
Out[34]:45
Ⅳ python 靜態方法可以訪問類方法嗎
Python的靜態方法和類成員方法都可以被類或實例訪問,兩者概念不容易理清,但還是有區別的:
1)靜態方法無需傳入self參數,類成員方法需傳入代表本類的cls參數;
2)從第1條,靜態方法是無法訪問實例變數的,而類成員方法也同樣無法訪問實例變數,但可以訪問類變數;
3)靜態方法有點像函數工具庫的作用,而類成員方法則更接近類似Java面向對象概念中的靜態方法。
實現靜態方法和類方法的兩種方式
一、在Python 2.3及之前,用staticmethod和classmethod類型對象包裝實現
例子如下(注意print里的說明):
class MyClass:
val1 = 'Value 1'
def __init__(self):
self.val2 = 'Value 2'
def staticmd():
print '靜態方法,無法訪問val1和val2'
smd = staticmethod(staticmd)
def classmd(cls):
print '類方法,類:' + str(cls) + ',val1:' + cls.val1 + ',無法訪問val2的值'
cmd = classmethod(classmd)
執行:
>>> mc = MyClass()
>>> mc.smd()
>>> mc.cmd()
>>> MyClass.smd()
>>> MyClass.cmd()
二、在Python 2.4及之後,用裝飾器(decorators)實現
裝飾器使用@操作符,例子如下:
class MyClass:
val1 = 'Value 1'
def __init__(self):
self.val2 = 'Value 2'
@staticmethod
def staticmd():
print '靜態方法,無法訪問val1和val2'
@classmethod
def classmd(cls):
print '類方法,類:' + str(cls) + ',val1:' + cls.val1 + ',無法訪問val2的值'
Ⅳ python函數和方法區別
python中函數和方法的區別:
首先,從分類的角度來分析。
(1)函數的分類:
內置函數:python內嵌的一些函數。
匿名函數:一行代碼實現一個函數功能。
遞歸函數
自定義函數:根據自己的需求,來進行定義函數。
普通方法:直接用self調用的方法。
私有方法:__函數名,只能在類中被調用的方法。
屬性方法:@property,將方法偽裝成為屬性,讓代碼看起來更合理。
特殊方法(雙下劃線方法):以__init__為例,是用來封裝實例化對象的屬性,只要是實例化對象就一定會執行__init方法,如果對象子類中沒有則會尋找父類(超類),如果父類(超類)也沒有,則直接繼承object(python 3.x)類,執行類中的__init__方法。
類方法:通過類名的調用去操作公共模板中的屬性和方法。
靜態方法:不用傳入類空間、對象的方法, 作用是保證代碼的一致性,規范性,可以完全獨立類外的一個方法,但是為了代碼的一致性統一的放到某個模塊(py文件)中。
- class Foo(object): def func(self): pass#實例化obj = Foo()# 執行方式一:調用的func是方法obj.func() #func 方法# 執行方式二:調用的func是函數Foo.func(123) # 函數
(2)方法的分類:
其次,從作用域的角度來分析:
(1)函數作用域:從函數調用開始至函數執行完成,返回給調用者後,在執行過程中開辟的空間會自動釋放,也就是說函數執行完成後,函數體內部通過賦值等方式修改變數的值不會保留,會隨著返回給調用者後,開辟的空間會自動釋放。
(2)方法作用域:通過實例化的對象進行方法的調用,調用後開辟的空間不會釋放,也就是說調用方法中對變數的修改值會一直保留。
最後,調用的方式不同。
(1)函數:通過「函數名()」的方式進行調用。
(2)方法:通過「對象.方法名」的方式進行調用。
Ⅵ 如何在Python中定義靜態變數
Python使用函數默認值實現函數靜態變數的方法,具體方法如下:
一、Python函數默認值
Python函數默認值的使用可以在函數調用時寫代碼提供方便,很多時候我們只要使用默認值就可以了。 所以函數默認值在python中用到的很多,尤其是在類中間,類的初始化函數中一幫都會用到默認值。 使用類時能夠方便的創建類,而不需要傳遞一堆參數。
只要在函數參數名後面加上 」=defalut_value」,函數默認值就定義好了。有一個地方需要注意的是,有默認值的參數必須在函數參數列表的最後,不允許將沒有默認值的參數放在有默認值的參數後,因為如果你那樣定義的話,解釋器將不知道如何去傳遞參數。
先來看一段示例代碼:
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
你調用上面的函數時,可以修改重試次數和輸出的提示語言,如果你比較懶得話,那麼什麼都不用改。
二、python使用函數默認值來實現函數靜態變數的功能
Python中是不支持靜態變數的,但是我們可以通過函數的默認值來實現靜態變數的功能。
當函數的默認值是內容是可變的類時,類的內容可變,而類的名字沒變。(相當於開辟的內存區域沒有變,而其中內容可以變化)。
這是因為python中函數的默認值只會被執行一次,(和靜態變數一樣,靜態變數初始化也是被執行一次。)這就是他們的共同點。
再來看下面的程序片段:
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)
其輸出結果是:
[1]
[1, 2]
[1, 2, 3]
['x', 4]
[1, 2, 3, 5]
前面的好理解,為什麼最後 「print f(5)」的輸出是 「[1, 2, 3, 5]」呢?
這是因為 「print f(4,['x'])」時,默認變數並沒有被改變,因為默認變數的初始化只是被執行了一次(第一次使用默認值調用),初始化執行開辟的內存區(我們可以稱之為默認變數)沒有被改變,所以最後的輸出結果是「[1, 2, 3, 5]」。