python類靜態方法
① python靜態方法和類方法的區別
classA:
deffun_i(self,x):
print(x)
@classmethod
deffun_c(cls,x):
print(x)
@staticmethod
deffun_s(x):
print(x)
a=A()
a.fun_i(1)
a.fun_s(1)
A.fun_c(1)
A.fun_s(1)
調用方式不同:
類方法:應該通過類調用
實例方法:應該通過實例調用
靜態方法:既可以通過類調用,也可以通過實例調用
實參和形參的定義和傳遞不同:
靜態方法:聲明和調用時,都沒有隱含參數。
實例方法:聲明時,要定義一個隱含參數:self。調用時,實例本身被隱含地傳遞給這個參數。
類方法:聲明時,要定義一個隱含參數:cls。調用時,類本身被隱含地傳遞給這個參數。
② python靜態方法怎麼調用
python靜態方法的調用:1、利用「類名.靜態方法」調用靜態方法;2、利用「實例.靜態方法」調用靜態方法。
下面代碼顯示了使用類名調用和實例調用。
課程推薦:三節課帶你入門python(青燈教育)
③ python類方法和靜態方法有什麼用
主要特點就是需要綁定到一個對象上,python解析器會自動把實例自身傳遞給方法,如14行所示,而直接使用InstanceMethod.f1()調用方法是不行的。
class InstanceMethod(object):
def __init__(self, a):
self.a = a
def f1(self):
print 'This is {0}.'.format(self)
def f2(self, a):
print 'Value:{0}'.format(a)
if __name__ == '__main__':
# im = InstanceMethod()
im = InstanceMethod('233')
im.f1()
# im.f2()
im.f2(233)
④ 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中靜態方法和類方法的區別
靜態方法(由@staticmethod裝飾的方法)、類方法(由@classmethod裝飾的方法),可以被類或類的實例對象調用。
類方法,第一個參數必須要默認傳類,一般習慣用cls。
區別:如果子類繼承父類的方法,子類覆蓋了父類的靜態方法,子類的實例繼承了父類的static_method靜態方法,調用該方法,還是調用的父類的方法和類屬性。
子類的實例繼承了父類的class_method類方法,調用該方法,調用的是子類的方法和子類的類屬性。
⑥ python 類方法,靜態方法,普通方法比較2019-03-22
1.類方法用@classmethod:
用途:一般用來對類屬性進行限制性操作
用法:該方法的調用者(不管是類調用還是實例調用),會默認把該類作為第一個參數傳進來(調用者不必顯示指定),這樣該方法內部可以獲取到該類,從而對類屬性進行操作。實際用途可以用來限制對類屬性的訪問,不管是類調用還是實例調用,能保證修改的都是類屬性。
2.靜態方法用@staticmethod:
用途:用來實現工具性方法
用法:如果方法內部沒有涉及到對實例屬性的操作,可以把該方法定義為靜態方法,不管是類調用還是實例調用,都能直接調用該方法實現相應功能。
3.普通方法:
用途:實例調用的方法
用法:方法內部涉及到對實例屬性的操作,實例調用該方法時會自動默認將實例的引用作為第一個參數傳進去。也可以用類直接訪問,不過這樣訪問時需要手動傳入第一個參數,也就是一個實例的引用。
附加: @property的使用(從語義規范上來說,只用於普通方法,也就是對實例變數進行控制,但也可以強行用來對類變數進行控制)
對私有變數的控制訪問可以借鑒java的get、set方式。這沒有任何問題。唯一的問題就是不直觀,把對變數的訪問變成了對方法的訪問。而@property的作用就是還原這種直觀的訪問方式,可以像訪問變數一樣訪問@property修飾的方法。注意:如果不想讓別人修改某變數,可以用不寫@XXX.setter方法來實現。
總結:不管方法是哪一種方法(類方法,靜態方法,還是普通的實例方法),都可以用類直接訪問和用實例進行訪問,只是參數多傳一個多傳一個的問題。更重要的是語義的規范,語法上沒什麼問題。
⑦ python裡面的靜態方法是不是不能遞歸
在類裡面定義的函數就是方法,類方法需要@ classmethod 修飾並且有個隱藏參數 cls,實例方法必須有個參數 self, 靜態方法必須有 @staticmethod修飾,類和實例都可以訪問靜態方法,實例可以訪問實例方法也可以訪問類方法
類可以訪問類方法也可以訪問實例方法,訪問實例方法必須要帶參數 self, 可以理解為類其實也是一個實例,類訪問實例方法不帶參數會報錯的.類本身可以訪問函數,實例卻不行.
⑧ python 為什麼要使用靜態方法
Python使用靜態方法類似函數工具使用,一般盡量少用靜態方法。
Python的靜態方法和類成員方法都可以被類或實例訪問,兩者概念不容易理清,但還是有區別的:
1)靜態方法無需傳入self參數,類成員方法需傳入代表本類的cls參數;
2)從第1條,靜態方法是無法訪問實例變數的,而類成員方法也同樣無法訪問實例變數,但可以訪問類變數;
3)靜態方法有點像函數工具庫的作用,而類成員方法則更接近類似Java面向對象概念中的靜態方法。
⑨ python中靜態方法和類方法的區別
Python的類就是個語法糖。一個函數寫在類裡面和寫在類外面沒有區別,唯一的區別就是參數,所謂實例方法就是第一個參數是self,所謂類方法就是第一個參數是class,而靜態方法不需要額外的參數,所以必須區分。