python3 中的cls和self的區別 靜態方法和類方法的區別


 


一般來說,要使用某個類的方法,需要先實例化一個對象再調用方法。

而使用@staticmethod或@classmethod,就可以不需要實例化,直接類名.方法名()來調用。

這有利於組織代碼,把某些應該屬於某個類的函數給放到那個類里去,同時有利於命名空間的整潔

class A():
        a='1'

        @staticmethod
        def foo1(name):
                print("hello,%s"%(name))
        def foo2(self,name):
                print("hello,%s"%(name))

        @classmethod
        def foo3(cls,name):
                print("hello,%s"%(name))


a=A()
a.foo1('mamq')
A.foo1('mamq')
print("---------------------"*20)
a.foo2('mamq')
#A.foo2('mamq')

a.foo3('foo3')
A.foo3('foo3')

首先定義一個類A,類A中有三個函數,foo1為靜態函數,用@staticmethod裝飾器裝飾,這種方法與類有某種關系但不需要使用到實例或者類來參與。如下兩種方法都可以正常輸出,也就是說既可以作為類的方法使用,也可以作為類的實例的方法使用。

  1.  
    a = A()
  2.  
    a.foo1( 'mamq') # 輸出: hello mamq
  3.  
    A.foo1( 'mamq')# 輸出: hello mamq

foo2為正常的函數,是類的實例的函數,只能通過a調用。

  1.  
    a.foo2( 'mamq') # 輸出: hello mamq
  2.  
    A.foo2( 'mamq') #   報錯:普通類方法不能這樣來調用 

foo3為類函數,cls作為第一個參數用來表示類本身. 在類方法中用到,類方法是只與類本身有關而與實例無關的方法。如下兩種方法都可以正常輸出。

  1.  
    a.foo3( 'mamq') # 輸出: hello mamq
  2.  
    A.foo3( 'mamq') # 輸出: hello mamq

 

 

在個人多次試驗后,目前只發現了 類方法有防止硬解碼的效果,其他情況下,類方法都可以用靜態方法代替

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM