python靜態方法的調用類
1. 為什麼python調用方法,有的前面加類名,有的不加
答: Python使用面向對象的方法進行編程時,確實有兩種調用方法。第一,當被調用的方法是靜態方法,那麼這個時候無須實例化對象,直接按照類名.函數名格式即可,如math.sin(),在該函數的底層實現當中,使用了@staticmethod聲明靜態方法,我的理解是這樣的,當某個方法經常被使用時,把它聲明成靜態方法會方便一些;第二,當被調用方法是非靜態方法時,則必須先實例化一個對象,再進行方法調用。希望能夠幫助到你。

例子
2. python靜態方法怎麼調用
python靜態方法的調用:1、利用「類名.靜態方法」調用靜態方法;2、利用「實例.靜態方法」調用靜態方法。
下面代碼顯示了使用類名調用和實例調用。
課程推薦:三節課帶你入門python(青燈教育)
3. python 如何調用類的方法
以numpy為例,首先創建一個對象:
In[32]:a=numpp.arange(10)
然後,a就擁有了類的方法,例如求和:
In[33]:a.sum()
Out[33]:45
也可以使用類的方法,將其應用到類的對象上,例如:
In[34]:numpp.sum(a)
Out[34]:45
4. python 類方法,靜態方法,普通方法比較2019-03-22
1.類方法用@classmethod:
用途:一般用來對類屬性進行限制性操作
用法:該方法的調用者(不管是類調用還是實例調用),會默認把該類作為第一個參數傳進來(調用者不必顯示指定),這樣該方法內部可以獲取到該類,從而對類屬性進行操作。實際用途可以用來限制對類屬性的訪問,不管是類調用還是實例調用,能保證修改的都是類屬性。
2.靜態方法用@staticmethod:
用途:用來實現工具性方法
用法:如果方法內部沒有涉及到對實例屬性的操作,可以把該方法定義為靜態方法,不管是類調用還是實例調用,都能直接調用該方法實現相應功能。
3.普通方法:
用途:實例調用的方法
用法:方法內部涉及到對實例屬性的操作,實例調用該方法時會自動默認將實例的引用作為第一個參數傳進去。也可以用類直接訪問,不過這樣訪問時需要手動傳入第一個參數,也就是一個實例的引用。
附加: @property的使用(從語義規范上來說,只用於普通方法,也就是對實例變數進行控制,但也可以強行用來對類變數進行控制)
對私有變數的控制訪問可以借鑒java的get、set方式。這沒有任何問題。唯一的問題就是不直觀,把對變數的訪問變成了對方法的訪問。而@property的作用就是還原這種直觀的訪問方式,可以像訪問變數一樣訪問@property修飾的方法。注意:如果不想讓別人修改某變數,可以用不寫@XXX.setter方法來實現。
總結:不管方法是哪一種方法(類方法,靜態方法,還是普通的實例方法),都可以用類直接訪問和用實例進行訪問,只是參數多傳一個多傳一個的問題。更重要的是語義的規范,語法上沒什麼問題。
5. Python和靜態方法問題,怎麼解決
在學習python代碼時,看到有的類的方法中第一參數是cls,有的是self,經過了解得知,python並沒有對類中方法的第一個參數名字做限制,可以是self,也可以是cls,不過根據人們的慣用用法,self一般是在實例方法中使用,而cls則一般在類方法中使用,在靜態方法中則不需要使用一個默認參數。在下面的代碼中,InstanceMethod類的方法中,第一個參數是默認的self,在這里可以把self換成任何名字來表示,不會有任何影響。在類調用的時候,需要滿足參數的個數要求(參數中含有*args是例外),例如13行中,類調用沒有參數的時候,會提示錯誤。同樣,實例方法的參數個數也應該滿足要求,例如16行中也會報錯。實例方法的一個主要特點就是需要綁定到一個對象上,python解析器會自動把實例自身傳遞給方法,如14行所示,而直接使用InstanceMethod.f1()調用方法是不行的。
12345678910111213
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)
靜態方法和類方法都需要使用修飾器,分別使用的是staticmethod和classmethod。靜態方法是和類沒有關系的,我覺得就是包裝在類中的一般方法,如下例子中,調用靜態方法使用實例和不使用實例都是可以的。類方法中,默認的第一個參數使用的是cls,類方法也可以不需要實例而直接使用類調用。對於這三種不同的方法,使用方法如下例所示。那麼問題來了,既然有了實例方法,類方法和靜態方法與之相比又有什麼好處呢?
在類方法中,不管是使用實例還是類調用方法,都會把類作為第一個參數傳遞進來,這個參數就是類本身。如果繼承了這個使用類方法的類,該類的所有子類都會擁有了這個方法,並且這個方法會自動指向子類本身,這個特性在工廠函數中是非常有用的。靜態方法是和類與實例都沒有關系的,完全可以使用一般方法代替,但是使用靜態方法可以更好的組織代碼,防止代碼變大後變得比較混亂。類方法是可以替代靜態方法的。靜態方法不能在繼承中修改。
123456789101112131415161718
class test(object): def instance_method(self): print 'This is {0}'.format(self) @staticmethod def static_method(): print 'This is static method.' @classmethod def class_method(cls): print 'This is {0}'.format(cls)if __name__ == '__main__': a = test() a.instance_method() a.static_method() a.class_method() print '----------------------------------------' # test.instance_method() test.static_method() test.class_method()
6. 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的值'
7. Python中靜態方法和類方法的區別
靜態方法(由@staticmethod裝飾的方法)、類方法(由@classmethod裝飾的方法),可以被類或類的實例對象調用。
類方法,第一個參數必須要默認傳類,一般習慣用cls。
區別:如果子類繼承父類的方法,子類覆蓋了父類的靜態方法,子類的實例繼承了父類的static_method靜態方法,調用該方法,還是調用的父類的方法和類屬性。
子類的實例繼承了父類的class_method類方法,調用該方法,調用的是子類的方法和子類的類屬性。
8. Python中靜態方法和類方法的區別
靜態方法是調用時跟具體實例沒有關聯的方法,不需要使用self和cls參數。
類方法是調用的時候,要使用類的相關成員的方法,需要使用cls參數,但不用self參數。
參考:劉江的Python教程
