python類的實例方法捷兰、靜態(tài)方法和類方法區(qū)別及其應(yīng)用場景

python類的實例方法立叛、靜態(tài)方法和類方法區(qū)別及其應(yīng)用場景

一、先看語法贡茅,python 類語法中有三種方法秘蛇,實例方法,靜態(tài)方法顶考,類方法赁还。

ps.python中self,cls的區(qū)別

普通實例方法村怪,第一個參數(shù)需要是self秽浇,它表示一個具體的實例本身。
如果用了staticmethod甚负,那么就可以無視這個self柬焕,而將這個方法當成一個普通的函數(shù)使用。
而對于classmethod梭域,它的第一個參數(shù)不是self斑举,是cls,它表示這個類本身病涨。

# coding:utf-8
class Foo(object): 
   """類三種方法語法形式"""   

     def instance_method(self):
         print("是類{}的實例方法富玷,只能被實例對象調(diào)用".format(Foo))     

    @staticmethod   
     def static_method():        
          print("是靜態(tài)方法")    

    @classmethod    
    def class_method(cls):        
        print("是類方法")

 foo = Foo()
foo.instance_method()
foo.static_method()
foo.class_method()
print('----------------')
Foo.static_method()
Foo.class_method()

運行結(jié)果如下

是類<class '__main__.Foo'>的實例方法,只能被實例對象調(diào)用
是靜態(tài)方法
是類方法
----------------
是靜態(tài)方法
是類方法

說明:

實例方法只能被實例對象調(diào)用既穆,靜態(tài)方法(由@staticmethod裝飾的方法)赎懦、類方法(由@classmethod裝飾的方法),可以被類或類的實例對象調(diào)用幻工。

實例方法励两,第一個參數(shù)必須要默認傳實例對象,一般習(xí)慣用self囊颅。
靜態(tài)方法当悔,參數(shù)沒有要求。

類方法踢代,第一個參數(shù)必須要默認傳類盲憎,一般習(xí)慣用cls。

二胳挎、靜態(tài)方法饼疙、類方法使用區(qū)別或者說使用場景

1、類方法用在模擬java定義多個構(gòu)造函數(shù)的情況串远。

由于python類中只能有一個初始化方法宏多,不能按照不同的情況初始化類儿惫。

參考django https://docs.djangoproject.com/en/1.9/ref/models/instances/ 請看下面的代碼澡罚。

# coding:utf-8
class Book(object):     
      def __init__(self, title):        
          self.title = title     

      @classmethod    
      def class_method_create(cls, title):                    
          book = cls(title=title)    
          return book     

      @staticmethod    
      def static_method_create(title):    
          book= Book(title)        
          return book

 book1 = Book("use instance_method_create book instance")
book2 = Book.class_method_create("use class_method_create book instance")
book3 = Book.static_method_create("use static_method_create book instance")
print(book1.title)
print(book2.title)
print(book3.title)

結(jié)果:

use instance_method_create book instance
use class_method_create book instance
use static_method_create book instance

Process finished with exit code 0

特別說明伸但,靜態(tài)方法也可以實現(xiàn)上面功能,當靜態(tài)方法每次都要寫上類的名字留搔,不方便更胖。

2、類中靜態(tài)方法方法調(diào)用靜態(tài)方法和類方法調(diào)用靜態(tài)方法例子隔显。 下面的代碼却妨,靜態(tài)方法調(diào)用另一個靜態(tài)方法,如果改用類方法調(diào)用靜態(tài)方法括眠,可以讓cls代替類彪标,

讓代碼看起來精簡一些。也防止類名修改了掷豺,不用在類定義中修改原來的類名捞烟。

# coding:utf-8class Foo(object):    X = 1    Y = 2     @staticmethod    def averag(*mixes):        return sum(mixes) / len(mixes)     @staticmethod    def static_method():  # 在靜態(tài)方法中調(diào)用靜態(tài)方法        print "在靜態(tài)方法中調(diào)用靜態(tài)方法"        return Foo.averag(Foo.X, Foo.Y)     @classmethod    def class_method(cls):  # 在類方法中使用靜態(tài)方法        print "在類方法中使用靜態(tài)方法"        return cls.averag(cls.X, cls.Y) foo = Foo()print(foo.static_method())print(foo.class_method())

結(jié)果:

在靜態(tài)方法中調(diào)用靜態(tài)方法
5
在類方法中使用靜態(tài)方法
5

**3、繼承類中的區(qū)別 **

從下面代碼可以看出当船,如果子類繼承父類的方法题画,子類覆蓋了父類的靜態(tài)方法,
子類的實例繼承了父類的static_method靜態(tài)方法德频,調(diào)用該方法苍息,還是調(diào)用的父類的方法和類屬性。

子類的實例繼承了父類的class_method類方法壹置,調(diào)用該方法竞思,調(diào)用的是子類的方法和子類的類屬性。

# coding:utf-8
class Foo(object):   
    X = 1   
    Y = 14    

   @staticmethod  
    def averag(*mixes):  
        # "父類中的靜態(tài)方法"        
        return sum(mixes) / len(mixes)           

   @staticmethod    
   def static_method(): 
       # "父類中的靜態(tài)方法"       
       print "父類中的靜態(tài)方法" 
       return Foo.averag(Foo.X, Foo.Y)         

   @classmethod    
   def class_method(cls):  
       # 父類中的類方法        
       print "父類中的類方法"      
       return cls.averag(cls.X, cls.Y) 

 class Son(Foo):   
     X = 3   
     Y = 5     

     @staticmethod    
     def averag(*mixes):  
        # "子類中重載了父類的靜態(tài)方法" 
       print "子類中重載了父類的靜態(tài)方法"            
       return sum(mixes) / 3

p = Son()
print "result of p.averag(1,5)"
print (p.averag(1,5))
print "result of p.static_method()"
print(p.static_method())
print "result of p.class_method()"
print(p.class_method())

結(jié)果如下:

result of p.averag(1,5)
子類中重載了父類的靜態(tài)方法
2
result of p.static_method()
父類中的靜態(tài)方法
7
result of p.class_method()
父類中的類方法
子類中重載了父類的靜態(tài)方法
2

Process finished with exit code 0
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钞护,一起剝皮案震驚了整個濱河市盖喷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌患亿,老刑警劉巖传蹈,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異步藕,居然都是意外死亡惦界,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門咙冗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沾歪,“玉大人,你說我怎么就攤上這事雾消≡植” “怎么了挫望?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長狂窑。 經(jīng)常有香客問我媳板,道長,這世上最難降的妖魔是什么泉哈? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任蛉幸,我火速辦了婚禮,結(jié)果婚禮上丛晦,老公的妹妹穿的比我還像新娘奕纫。我一直安慰自己,他們只是感情好烫沙,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布匹层。 她就那樣靜靜地躺著,像睡著了一般锌蓄。 火紅的嫁衣襯著肌膚如雪升筏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天煤率,我揣著相機與錄音仰冠,去河邊找鬼。 笑死蝶糯,一個胖子當著我的面吹牛洋只,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昼捍,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼识虚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了妒茬?” 一聲冷哼從身側(cè)響起担锤,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乍钻,沒想到半個月后肛循,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡银择,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年多糠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浩考。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡夹孔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情搭伤,我是刑警寧澤只怎,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站怜俐,受9級特大地震影響身堡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜佑菩,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一盾沫、第九天 我趴在偏房一處隱蔽的房頂上張望裁赠。 院中可真熱鬧殿漠,春花似錦、人聲如沸佩捞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽一忱。三九已至莲蜘,卻和暖如春儒飒,著一層夾襖步出監(jiān)牢的瞬間查邢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工阱洪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芬迄,地道東北人问顷。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像禀梳,于是被迫代替她去往敵國和親杜窄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容