當前位置:首頁 » 編程語言 » python靜態函數

python靜態函數

發布時間: 2024-12-19 13:53:36

python 類方法和靜態方法的區別

面相對象程序設計中,類方法和靜態方法是經常用到的兩個術語。
邏輯上講:類方法是只能由類名調用;靜態方法可以由類名或對象名進行調用。
在C++中,靜態方法與類方法邏輯上是等價的,只有一個概念,不會混淆。
而在python中,方法分為三類實例方法、類方法、靜態方法。代碼如下:

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,列印對象內存地址「<__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(); # 錯誤,TypeError: unbound method instanceFun() must be called with Test instance as first argument
Test.InstanceFun(t); # 輸出InstanceFun,列印對象內存地址「<__main__.Test object at 0x0293DCF0>」
t.ClassFun(Test); # 錯誤 classFun() takes exactly 1 argument (2 given)

可以看到,在python中,兩種方法的主要區別在於參數。實例方法隱含的參數為類實例self,而類方法隱含的參數為類本身cls。
靜態方法無隱含參數,主要為了類實例也可以直接調用靜態方法。
所以邏輯上類方法應當只被類調用,實例方法實例調用,靜態方法兩者都能調用。主要區別在於參數傳遞上的區別,實例方法悄悄傳遞的是self引用作為參數,而類方法悄悄傳遞的是cls引用作為參數。
python實現了一定的靈活性使得類方法和靜態方法,都能夠被實例和類二者調用

⑵ 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的值'

熱點內容
閑置硬碟搭建nas伺服器 發布:2024-12-19 16:39:40 瀏覽:418
健康網站源碼 發布:2024-12-19 16:38:03 瀏覽:449
庫樂隊安卓版在哪裡 發布:2024-12-19 16:33:45 瀏覽:395
通過網頁上傳ftp 發布:2024-12-19 16:32:57 瀏覽:363
androidx86sd 發布:2024-12-19 16:27:59 瀏覽:874
kms請輸入伺服器IP 發布:2024-12-19 16:26:40 瀏覽:274
快付吧安卓版怎麼樣 發布:2024-12-19 16:25:08 瀏覽:635
php圖片鏈接 發布:2024-12-19 16:02:41 瀏覽:407
動力型壓縮機 發布:2024-12-19 15:58:09 瀏覽:692
c語言和java區別 發布:2024-12-19 15:49:35 瀏覽:599