一文帶你搞懂python中什麼是實例方法,什麼是類方法,什麼是靜態方法!!!

類的實例方法

什麼是類的實例方法
聽名字便可不言而喻,只有當被實例化之後,纔可以被調用,纔可以實現方法體。一般顯著特徵會帶有self參數,因爲這是實例方法獨有的,爲什麼這麼說呢?因爲實例化後會將實例化後的內存地址通過self傳進去,來達到調用實例化屬性的目的。
代碼示例

class Student(object):
    def __init__(self,name):
        self.name=name
    def information(self):
   	
        print("我叫{}".format(self.name))
		
Student("張三").information()


Student("李四").information() 
'''
運行結果:

我叫張三
我叫李四
'''

我們可以揭祕一下調用過程
首先我們先看第一個類的實例化之後,將張三傳入初始化方法(init()方法)裏面的name形參並且將這個實例化的地址也傳入初始化方法中的self形參,換一句話可以說self是對象實例的引用,形參變實參,執行初始化方法中的語句。執行完畢又調用了information()方法,同樣還是傳入實例化地址,形參self變實參,執行方法中的語句,調用結束。

那麼第二個類的實例化之後跟第一個是大同小異的,只是實例化後的內存地址是不一樣的這裏就不再詳解了。

應用場景:實例方法應用較多,幾乎無處不在。

類的靜態方法

什麼是類的靜態方法
那麼帶有self的方法是類的實例方法,那麼沒有帶self的方法是什麼方法呢?他是類的靜態方法。

定義靜態方法的方式
採用修飾符staticmethod,python定義什麼修飾符都需要加@,這應該早已成習慣。

應用場景:
一般用於既不需要訪問實例屬或者調用實例方法,也不需要訪問類屬性或者調用實例方法,這種情況是存在的。
其實你早都應該見過比如:

class foo:
    def instantiation_mathod(self):
    	#不訪問實例屬性/類屬性
        print("這是實例方法")
        
foo().instantiation_mathod()
'''
運行結果:

這是實例方法
'''

總結:哈哈!這下你總算知道了把,原來這就是應用場景啊!這不是實例方法嗎?是的,這是實例方法,但是他並沒有進行傳參,所以完全可以定義成靜態方法。在pycharm中定義如上代碼,pycharm會提示你定義成靜態方法。以便不用實例化,直接調用。
代碼示例

class foo:
    @staticmethod
    def static_mathod():
    	#不訪問實例屬性/類屬性
        print("這是靜態方法")

foo.static_mathod()

# 不推薦使用
foo().static_mathod()

'''
運行結果:

這是靜態方法
這是靜態方法
'''

結論:注意跟實例方法不同的是,不傳遞self參數,可以不通過實例化直接通過類名.方法名()調用,也可以通過實例化後通過類名().方法名調用,但是這種調用失去了意思,如果實例化後了,調用方法,那麼申明成靜態方法的意義何在呢?

類方法

什麼是類方法
實例化之後的類中的方法都是在實例中運行,那麼如果說
就要用到類方法。
定義類方法的方式
在方法上面添加裝飾器@classmethod來修飾

使用場景
當一個方法只涉及到靜態屬性的時候可以使用類方法:
代碼示例

class fruit():
    __discount=1
    def __init__(self,name,price):
        self.name=name
        self.__price=price
    def price(self):
        return "水果名:{},價格:{}/斤".format(self.name,self.__price*self.__discount)

    @classmethod
    def fruit_discount(cls,new_discount):
       cls.__discount=new_discount

fruit.fruit_discount(0.8)
print(fruit("蘋果", 18).price())
print(fruit("香蕉",20).price())

'''
運行結果:

水果名:蘋果,價格:14.4/斤
水果名:香蕉,價格:16.0/斤
'''

結論:在上述案例中,我們將設置折扣重新定義了一個類,並且加上裝飾器@classmethod,不用實例化後就能調用。有的人可能沒理解,認爲類方法沒什麼用。因爲類方法能夠左右實例方法,這意味着只用 調用一次類方法,實例方法中的折扣早已改變。
那麼這三者有什麼區別呢?

實例方法、類方法、靜態方法的區別:

這三種方法都是保存在類的內存中,調用者不同。
實例方法由對象調用,至少一個self參數,self代表對象的引用。
類方法由類調用,至少一個cls參數,並且需要裝飾器@classmethod修飾
靜態方法由類調用,不需要參數,需要裝飾器@staticmethod修飾

來一波,推送吧!
羣號:781121386
羣名:人生苦短,我學編程
歡迎大家加入我們,一起交流技術!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章