Python 的類實際上是一個特殊的對象

Python 中的類是一個特殊的對象。python

Python 中一切皆對象:程序員

  • class AAA:定義的類屬於類對象。
  • obj1 = AAA(): 屬於實例對象。

在程序運行時,類一樣會被加載到內存,類是一個特殊的對象——類對象。函數

類對象在內存中只有一份,使用一個類能夠建立出不少個對象實例。工具

除了封裝實例的屬性和方法外,類對象還能夠擁有本身的屬性和方法。學習

經過 '類名.' 的方式能夠訪問類的屬性或者調用類的方法。code

1、類屬性對象

類屬性就是給類對象中定義的屬性,一般用來記錄與這個類相關的特徵,類屬性不會用於記錄具體對象的特徵。blog

類屬性的特色是,全部類的實例化對象都同時共享類屬性,也就是說,類屬性在全部實例化對象中是做爲公用資源存在的。圖片

示例:
在這裏插入圖片描述內存

class Tool(object):

    # 使用賦值語句定義類屬性,記錄全部工具對象的數量
    count = 0

    def __init__(self, name):
        self.name = name

        # 讓類屬性的值+1
        Tool.count += 1

# 1. 建立工具對象
tool1 = Tool("斧頭")
tool2 = Tool("榔頭")
tool3 = Tool("水桶")

# 2. 輸出工具對象的總數
print(Tool.count)  # 3

屬性的獲取機制

在 Python 中屬性的獲取存在一個向上查找機制。
在這裏插入圖片描述
在python中,經過 tool1.count 的方式是怎麼獲取屬性的值的?

首先,在 Tool 類中定義了類屬性 count 和 實例屬性 name,咱們要訪問 count 屬性,是經過 Tool.count 的方式進行訪問。可是在 Python中,除了能夠用類名的方式來訪問類屬性,還能夠使用對象變量的方式進行訪問。

假設咱們實例化了 Tool 類,獲得了對象 tool1,在調用 tool1.count 的時候,首先是查找的對象 tool1 中的對象,若是沒有找到,那麼解釋器就會向上尋找類中的 count 屬性,若是找到就輸出,若是沒有找到就報錯。

這就是 python 中的屬性向上查找機制。

所以,要訪問類屬性有兩種方式:

  • 類名.類屬性
  • 對象.類屬性 (不推薦)

注意:若是使用"對象.類屬性 = 值"的賦值語句,只會給對象添加一個屬性,而不會影響到類屬性的值。

示例:

#Python學習交流羣:778463939

class Tool(object):

    # 使用賦值語句定義類屬性,記錄全部工具對象的數量
    count = 0

    def __init__(self, name):
        self.name = name

        # 讓類屬性的值+1
        Tool.count += 1

# 1. 建立工具對象
tool1 = Tool("斧頭")
tool2 = Tool("榔頭")
tool3 = Tool("水桶")

# 2. 輸出工具對象的總數
tool3.count = 99
print(tool3.count)  # 99
print(Tool.count)  # 3

2、類方法

類方法就是針對類對象定義的方法,在類方法內部能夠直接訪問類屬性或者調用其餘的類方法。

Python 類方法和實例方法類似,它最少也要包含一個參數,只不過類方法中一般將其命名爲 cls,

Python 會自動將類自己綁定給 cls 參數(注意,綁定的不是類對象)。

語法以下:

@classmethod
def 類方法名(cls):
    pass

類方法須要用修飾器 @classmethod 來標識,告訴解釋器這是一個類方法。

類方法的第一個參數應該是 cls,由哪個類調用的方法,方法內的 cls 就是哪個類的引用,這個參數和實例方法的第一個參數是 self 相似。

和 self 同樣,cls 參數的命名也不是規定的(能夠隨意命名),只是 Python 程序員約定俗稱的習慣而已。

經過 '類名.' 的方式調用類方法,調用方法時,不須要傳遞 cls 參數。

在方法內部,能夠經過 'cls.' 訪問類的屬性,也能夠經過 'cls.' 調用其餘的類方法。

示例:
在這裏插入圖片描述

#Python學習交流羣:778463939
@classmethod
def show_tool_count(cls):
    """顯示工具對象的總數"""
    print("工具對象的總數 %d" % cls.count)

3、靜態方法

在開發時,若是須要在類中封裝一個方法,這個方法既不須要訪問實例屬性或者調用實例方法,也不須要訪問類屬性或者調用類方法,這個時候,能夠把這個方法封裝成一個靜態方法。

靜態方法,其實就是咱們學過的函數,和函數惟一的區別是,靜態方法定義在類這個空間(類命名空間)中,而函數則定義在程序所在的空間(全局命名空間)中。

靜態方法:由類調用;無默認參數。

語法以下:

@staticmethod
def 靜態方法名():
    pass

靜態方法須要用修飾器 @staticmethod 來標識,告訴解釋器這是一個靜態方法。經過 '類名.' 的方式調用靜態方法。

靜態方法沒有相似 self、cls 這樣的特殊參數,所以 Python 解釋器不會對它包含的參數作任何類或對象的綁定。也正由於如此,類的靜態方法中沒法調用任何類屬性和類方法。

示例:

class Dog(object):

    @staticmethod
    def run():
        
        # 不訪問實例屬性/類屬性
        print("小狗要跑...")

# 經過類名.調用靜態方法 - 不須要建立對象
Dog.run()
相關文章
相關標籤/搜索