python 靜態(tài)方法,類方法者娱,實例方法的區(qū)別

實例方法:

顧名思義就是給實例使用的方法抡笼。
  就是我們使用最普遍的在類內(nèi)部定義的方法。

實例方法第一個參數(shù)為 self黄鳍。self表示當(dāng)前調(diào)用此方法的實例推姻,相當(dāng)于其他語言中的this。

實例方法可以調(diào)用實例屬性际起,也可以調(diào)用類屬性拾碌。類屬性的調(diào)用有兩種格式:self.類屬性 吐葱, 類名.類屬性街望。兩種都是一樣的。但是不要使用self來調(diào)用類屬性弟跑!類屬性是給類使用的灾前,一定要用類名去調(diào)用

實例方法必須通過實例來調(diào)用

實例屬性:以self.屬性 格式的屬性都為實例屬性孟辑。實例方法是屬于實例的哎甲,每個實例都有單獨(dú)的實例屬性蔫敲。
  類屬性:在類內(nèi)部方法的外部定義的屬性,不以self.屬性的格式的屬性炭玫。類屬性是屬于類的奈嘿。所有當(dāng)前類的 實例 都共享 類 的類屬性。
  類屬性 相當(dāng)于java中的 static 屬性吞加。

class Foo(object):
    class_property = '類屬性'

    def __init__(self):
        self.instance_property = '實例屬性'

    def say(self):
        print '實例方法'
        print '調(diào)用實例屬性---',self.instance_property
        #兩種是一樣的裙犹,但是切記:類屬性要用類名去調(diào)用
        #print '調(diào)用類屬性---',self.class_property
        print '調(diào)用類屬性---',Foo.class_property

if __name__ == '__main__':
    my_foo = Foo()
    my_foo.say()     #必須通過實例來調(diào)用
類方法:

顧名思義,類方法就是給類使用的方法衔憨。
  類方式用 @classmethod裝飾器修飾叶圃。用@classmethod裝飾器修飾的方法都是類方法。
  類方法第一個參數(shù)為cls践图,cls表示當(dāng)前類掺冠。
  類方法可以調(diào)用類屬性,但是不能調(diào)用實例屬性码党,也不能調(diào)用實例方法德崭。
  類方法有兩種調(diào)用方式:
    類名.類方法
    實例.類方法。
   兩種是一樣的闽瓢。但是 切記 類方法是給類使用的 不要使用實例去調(diào)用類方法接癌。一定要用類名去調(diào)用。
  類方法相當(dāng)于 Java中的 static方法扣讼。

class Foo(object):
    class_property = '類屬性'

    def __init__(self):
        self.instance_property = '實例屬性'

    def say(self):
        print '實例方法'
        print '調(diào)用實例屬性---',self.instance_property
        print '調(diào)用類屬性---',Foo.class_property

    @classmethod
    def class_say(cls):
        print '類方法'
        #無法調(diào)用實例屬性缺猛,會報錯
        #print '調(diào)用實例屬性',cls.instance_property
        #無法調(diào)用實例方法,會報錯
        #cls.say()
        print '調(diào)用類屬性',cls.class_property

if __name__ == '__main__':
    Foo.class_say()

    #這樣調(diào)用也可以椭符,但是千萬不要這樣做
    # my_foo = Foo()
    # my_foo.class_say()
    
靜態(tài)方法:

靜態(tài)方法是一種普通函數(shù)荔燎,位于類定義內(nèi)部。
  靜態(tài)方法以@staticmethod裝飾器修飾销钝。以@staticmethod修飾的方法都是靜態(tài)方法有咨。
  靜態(tài)方法無法調(diào)用實例屬性,實例方法蒸健。
  靜態(tài)方法內(nèi)部必須使用 類名.類實例座享,類名.類方法 這樣的格式才能調(diào)用類屬性與類方法,否則無法調(diào)用似忧。
  靜態(tài)方法與類方法一樣 都是屬于類渣叛。

  靜態(tài)方法有兩種調(diào)用方式:
    類名.靜態(tài)方法
    實例.靜態(tài)方法
   兩種是一樣的。但是 切記 靜態(tài)方法是給類使用的 不要使用實例去調(diào)用靜態(tài)方法盯捌。一定要用類名去調(diào)用淳衙。

class Foo(object):
    class_property = '類屬性'

    def __init__(self):
        self.instance_property = '實例屬性'

    def say(self):
        print '實例方法'
        print '調(diào)用實例屬性---',self.instance_property
        print '調(diào)用類屬性---',Foo.class_property

    @classmethod
    def class_say(cls):
        print '類方法'
        print '調(diào)用類屬性',cls.class_property

    @staticmethod
    def static_say():
        print '靜態(tài)方法'
        #必須以類名.類方法或?qū)嵗?才能調(diào)用類方法或者類屬性,否則不能調(diào)用
        print '調(diào)用類屬性',Foo.class_property
        print '調(diào)用類方法',Foo.class_say()

if __name__ == '__main__':
    Foo.static_say()

    #這樣調(diào)用也可以,但是千萬不要這樣做
    # my_foo = Foo()
    # my_foo.static_say()

為什么要存在類方法箫攀?
  比如:我們需要進(jìn)行數(shù)據(jù)庫操作肠牲,創(chuàng)建數(shù)據(jù)庫連接只需要進(jìn)行一次即可,不需要每次都創(chuàng)建數(shù)據(jù)庫連接靴跛。
  類方法中的類實例只會初始化一次缀雳,以后每次調(diào)用均是同一個類屬性,并不會再次初始化梢睛。只要調(diào)用一次以后俏险,不管在任何模塊中調(diào)用都不會在初始化。

class Foo(object):
    class_property = None

    @classmethod
    def class_say(cls):
        print '類方法'
        print '類屬性--',cls.class_property
        print '類屬性 id ',id(cls.class_property)
        if cls.class_property == None:
            cls.class_property = time.time()
        print '****調(diào)用類屬性',cls.class_property
        print '****調(diào)用雷屬性 id ',id(cls.class_property)

    @staticmethod
    def static_say():
        print '靜態(tài)方法'
        #必須以類名.類方法或?qū)嵗?才能調(diào)用類方法或者類屬性扬绪,否則不能調(diào)用
        print '****調(diào)用類屬性',Foo.class_property
        print '****調(diào)用類方法',Foo.class_say()

if __name__ == '__main__':
    Foo.class_say()
    print '-------'
    Foo.class_say()
    print '-------'

    print '實例'
    foo = Foo2()
    foo2 = Foo2()

    foo.say()
    foo2.say()

運(yùn)行結(jié)果如下:


image.png

我們可以看到 類屬性只進(jìn)行了一次初始化竖独,以后的調(diào)用均是同一個類實例。
實例屬性則是挤牛,每建立一個實例就會初始化一次莹痢,除非你只要一個實例,在單個模塊中這樣可以墓赴,但是在多個模塊中這是不可能的竞膳。
我們看一個多個模塊中的情況:

#coding=utf-8
#test2.py
import time

class Foo(object):
    class_property = None

    @classmethod
    def class_say(cls):
        print '類方法'
        print '類屬性--',cls.class_property
        print '類屬性 id ',id(cls.class_property)
        if cls.class_property == None:
            cls.class_property = time.time()
        print '****調(diào)用類屬性',cls.class_property
        print '****調(diào)用雷屬性 id ',id(cls.class_property)

class Foo2(object):
    def __init__(self):
        self.instanlce_property = None

    def say(self):
        print '實例方法'
        print '調(diào)用實例屬性 --',self.instanlce_property
        print '實例屬性 id',id(self.instanlce_property)
        if self.instanlce_property == None:
            self.instanlce_property = time.time()
        print '****調(diào)用實例屬性  --', self.instanlce_property
        print '****實例屬性   id', id(self.instanlce_property)
#coding=utf-8
#test4.py
import test2

def test4_class_foo():
    print '類屬性 test4模塊'
    foo = test2.Foo
    foo.class_say()

def test4_instance_foo():
    print '實例 test4模塊'
    foo2 = test2.Foo2()
    foo2.say()
coding=utf-8
#test3.py
import test2
import test4

def test3_class_foo():
    print '類屬性 test3模塊'
    foo = test2.Foo
    foo.class_say()

def test3_instanlce_foo():
    print '實例屬性 test3模塊'
    foo2 = test2.Foo2()
    foo2.say()

if __name__ == '__main__':
    test3_class_foo()
    test4.test4_class_foo()
    print '實例-----------'
    test3_instanlce_foo()
    test4.test4_instance_foo()

運(yùn)行結(jié)果如下:


image.png

可以清楚的看到 不同模塊之間 類屬性只初始化一次,實例屬性則是诫硕,每建立一個實例就會初始化一次坦辟。除非你只要一個實例,在單個模塊中這樣可以章办,但是在多個模塊中這是不可能的

靜態(tài)方法與類方法的用途是一樣的锉走,沒什么區(qū)別。
但是為什么要存在靜態(tài)方法呢藕届?

為了更加面向?qū)ο笤O(shè)計(oop)

首先挪蹭,靜態(tài)方法就是一普通函數(shù)
  其次,靜態(tài)方法是與類無關(guān)的休偶。也就是說 靜態(tài)方法實現(xiàn)的功能可以是與所存在的類所實現(xiàn)的功能沒有任何關(guān)系梁厉。類方法的功能,則是與類所實現(xiàn)的功能相關(guān)聯(lián)的踏兜。打個比方就是 :類方法相當(dāng)于類的親兒子词顾,靜態(tài)方法就相當(dāng)于收養(yǎng)的流浪貓。
  oop的思想是 一切以類為基礎(chǔ)碱妆。
  為了更加oop肉盹,所有說就把普通函數(shù)塞進(jìn)來類里面,這就是靜態(tài)方山橄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垮媒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子航棱,更是在濱河造成了極大的恐慌睡雇,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饮醇,死亡現(xiàn)場離奇詭異它抱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)朴艰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門观蓄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人祠墅,你說我怎么就攤上這事侮穿。” “怎么了毁嗦?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵亲茅,是天一觀的道長。 經(jīng)常有香客問我狗准,道長克锣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任腔长,我火速辦了婚禮袭祟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捞附。我一直安慰自己巾乳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布鸟召。 她就那樣靜靜地躺著想鹰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪药版。 梳的紋絲不亂的頭發(fā)上辑舷,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音槽片,去河邊找鬼何缓。 笑死,一個胖子當(dāng)著我的面吹牛还栓,可吹牛的內(nèi)容都是我干的碌廓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼剩盒,長吁一口氣:“原來是場噩夢啊……” “哼谷婆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤纪挎,失蹤者是張志新(化名)和其女友劉穎期贫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體异袄,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡通砍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了烤蜕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片封孙。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖讽营,靈堂內(nèi)的尸體忽然破棺而出虎忌,到底是詐尸還是另有隱情,我是刑警寧澤橱鹏,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布呐籽,位于F島的核電站,受9級特大地震影響蚀瘸,放射性物質(zhì)發(fā)生泄漏狡蝶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一贮勃、第九天 我趴在偏房一處隱蔽的房頂上張望贪惹。 院中可真熱鬧,春花似錦寂嘉、人聲如沸奏瞬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽硼端。三九已至,卻和暖如春寓搬,著一層夾襖步出監(jiān)牢的瞬間珍昨,已是汗流浹背离例。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工强重, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人运吓。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓唾琼,卻偏偏與公主長得像兄春,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锡溯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

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

  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,915評論 6 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理赶舆,服務(wù)發(fā)現(xiàn)哑姚,斷路器,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 要點(diǎn): 函數(shù)式編程:注意不是“函數(shù)編程”芜茵,多了一個“式” 模塊:如何使用模塊 面向?qū)ο缶幊蹋好嫦驅(qū)ο蟮母拍钚鹆俊傩浴?..
    victorsungo閱讀 1,476評論 0 6
  • 定義類并創(chuàng)建實例 在Python中,類通過 class 關(guān)鍵字定義夕晓。以 Person 為例,定義一個Person類...
    績重KF閱讀 3,931評論 0 13
  • Python進(jìn)階框架 希望大家喜歡悠咱,點(diǎn)贊哦首先感謝廖雪峰老師對于該課程的講解 一蒸辆、函數(shù)式編程 1.1 函數(shù)式編程簡...
    Gaolex閱讀 5,493評論 6 53