Python 中的類是一個特殊的物件,
Python 中一切皆物件:
- class AAA:定義的類屬于類物件,
- obj1 = AAA(): 屬于實體物件,
在程式運行時,類同樣會被加載到記憶體,類是一個特殊的物件——類物件,
類物件在記憶體中只有一份,使用一個類可以創建出很多個物件實體,
除了封裝實體的屬性和方法外,類物件還可以擁有自己的屬性和方法,
通過 '類名.' 的方式可以訪問類的屬性或者呼叫類的方法,
一、類屬性
類屬性就是給類物件中定義的屬性,通常用來記錄與這個類相關的特征,類屬性不會用于記錄具體物件的特征,
類屬性的特點是,所有類的實體化物件都同時共享類屬性,也就是說,類屬性在所有實體化物件中是作為公用資源存在的,
示例:

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
二、類方法
類方法就是針對類物件定義的方法,在類方法內部可以直接訪問類屬性或者呼叫其他的類方法,
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)
三、靜態方法
在開發時,如果需要在類中封裝一個方法,這個方法既不需要訪問實體屬性或者呼叫實體方法,也不需要訪問類屬性或者呼叫類方法,這個時候,可以把這個方法封裝成一個靜態方法,
靜態方法,其實就是我們學過的函式,和函式唯一的區別是,靜態方法定義在類這個空間(類命名空間)中,而函式則定義在程式所在的空間(全域命名空間)中,
靜態方法:由類呼叫;無默認引數,
語法如下:
@staticmethod
def 靜態方法名():
pass
靜態方法需要用修飾器 @staticmethod 來標識,告訴解釋器這是一個靜態方法,通過 '類名.' 的方式呼叫靜態方法,
靜態方法沒有類似 self、cls 這樣的特殊引數,因此 Python 解釋器不會對它包含的引數做任何類或物件的系結,也正因為如此,類的靜態方法中無法呼叫任何類屬性和類方法,
示例:
class Dog(object):
@staticmethod
def run():
# 不訪問實體屬性/類屬性
print("小狗要跑...")
# 通過類名.呼叫靜態方法 - 不需要創建物件
Dog.run()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/163641.html
標籤:其他
上一篇:python字串中拼接6種姿勢
