python中類對象、實例對象、類屬性、實例屬性、類方法、實例方法、靜態方法


類對象、類屬性與實例對象、實例屬性的區別

在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所屬類,於是就定義了靜態方法。


免責聲明!

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



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