類對象、類屬性與實例對象、實例屬性的區別
在Python中一切皆是對象,類是一個特殊的對象即類對象,描述類的屬性稱為類屬性。類屬性在內存中只有一份,在__init__外部定義。
通過類創建的對象稱為實例對象,描述實例對象的屬性稱為實例屬性。實例屬性在各自對象的內存中都保存一份,在__init__方法內部定義。
實例方法、類方法、靜態方法的區別
這三種方法都是保存在類的內存中,調用者不同。
- 實例方法由對象調用,至少一個self參數,self代表對象的引用。
- 類方法有類調用,至少一個cls參數,並且需要裝飾器@classmethod修飾。
- 靜態方法由類調用,不需要參數,需要裝飾器@staticmethod修飾。
創建原則:
- 只要訪問了成員變量的方法都叫實例方法
- 只訪問類變量的方法叫類方法
- 既不訪問成員變量,也不訪問類變量的方法叫成靜態方法
舉例說明
class Car(object): # 類對象 car_num = 0 # 類屬性,在__init__外部定義。 def __init__(self, brand, price): self.brand = brand # 實例屬性,在__init__內部定義 self.price = price Car.car_num += 1 def level(self): # 實例方法,調用了實例屬性 if self.price > 300000: print(f"{self.brand}是高級轎車") else: print(f"{self.brand}是非高級轎車") @classmethod def car_count(cls): # 類方法,只訪問類變量 print(f"我有{cls.car_num}輛車") @staticmethod def tips(): # 靜態方法,既不訪問成員變量,也不訪問類變量 print("溫馨提示:開車不喝酒") if __name__ == "__main__": bmw = Car("寶馬", 200000) # 通過類創建的對象稱為實例對象 bmw.level() wlhg = Car("五菱宏光", 400000) wlhg.level() Car.car_count() # 調用類方法 Car.tips() # 調用靜態方法
為什么會有靜態方法?
靜態方法既不訪問成員變量,也不訪問類變量,若寫個和class同級別的def函數也能實現同樣的功能,何必定義個靜態方法呢?定義靜態方法主要是規避兩個模塊調用同名函數的情況,
假設一個場景:為Car類定義一個同級別的def tips函數,再為Animal類定義一個同級別的def tips函數
class Car(object): pass def tips(): print("溫馨提示:開車不喝酒") class Animal(object): pass def tips(): print("溫馨提示:不要伸手投食")
在python中,前面定義的函數會被后定義的同名函數覆蓋,也就是說,按上面的場景調用tips 方法最終都調用的都是最后一個。為了明確各個tips所屬類,於是就定義了靜態方法。