學習本篇文章後會瞭解到:類的創建,爲對象添加屬性,對象的初始化,自定義對象的輸出,類屬性和類方法的創建。
1. 類的定義與格式
-
類是對一羣具有相同特徵或者行爲的事物的一個統稱。
-
類是一個模塊,是負責創建對象的。
-
類的命名採用大駝峯命名法。
-
類中的特徵稱爲屬性,行爲稱爲方法
格式:class 類名: def 方法1(self,參數列表): pass def 方法2(self,參數列表):
注意:在類中定義的方法中的第一個參數是self。當然也可以採用其他的名稱只是習慣性的使用self。
要設計一個類,通常需要滿足一下三個要素:
- 類名 這類事情的名字,滿足大駝峯命名法。
- 屬性 表示類具有什麼樣的特徵。
- 方法 表示類具有什麼樣的行爲。
1.1 創建類及self的含義
在類中創建一個函數時,系統自動在函數中添加self參數。哪一個對象調用的方法,self就是哪一個對象的引用;在調用方法時,不需要傳遞self參數。在方法內部調用對象的屬性可以使用 self. 的方式,也可以通過 self. 調用其他的對象方法。
class Person:
def run(self):
print("跑步功能")
def eat(self):
print("吃飯")
# 創建兩個Person對象,並分別調用類中的兩個方法
tom = Person()
tom.eat()
tom.run()
print()
danni = Person()
danni.run()
danni.eat()
print(danni) # 打印出引用的地址
運行結果如下:
吃飯
跑步功能
跑步功能
吃飯
<__main__.Person object at 0x0000000002588C88>
補充:
在計算機中通常使用十六進制表示內存地址。
%d:可以以10進制輸出數字
%x :可以以16進制輸出數字
2. 對象
是由類創建出來的一個具體存在,可以直接使用如下的格式
對象變量名 = 類名()
其實在面向對象過程中:變量,數據,函數都是對象
類和對象的關係
- 類只有一個,而對象可以有很多個(類可以創建多個對象)。
- 不同的對象之間屬性可能會各不相同。
- 類中定義什麼屬性和方法,對象中就有什麼屬性和方法,不可能多,也不能少
2.1. 給對象增加屬性
方法一:
使用在類外界使用對象名 .屬性名 ,利用賦值語句進行增加。
class Person:
def run(self):
print("%s跑步功能" % self.name ) # 格式化輸出,在方法內部調用對象的屬性,**self.**屬性名
def eat(self):
print("吃飯")
tom = Person() # 創建一個Person對象
tom.name = "Tom" # 給對象添加一個屬性 name
tom.run()
tom.eat()
print()
運行結果:
Tom跑步功能
吃飯
方法二:
下面講到__init__()函數的時候會講到
注意:
- 在類的外部,通過變量名. 訪問對象的屬性和方法
- 在類封裝的方法中,通過self. 訪問對象的屬性和方法。
3. 初始化方法
當使用類名()創建對象時,會自動執行一下操作:
- 爲對象在內存中分配空間—創建對象(
__new__
) - 爲對象的屬性設置初始值—初始化方法(
__init__
)
注意:以兩個下劃線開頭以兩個下劃線結尾的函數爲Python中的內置函數。可以直接被調用
3.1 __init__
__init__()
方法是專門用來定義一個類具有哪些屬性的方法,就是無論系統是否調用,都會被執行。
示例代碼:
演示一:
class Cat:
def __init__(self):
print("這是初始化方法") # 系統會直接調用
cat = Cat()
演示結果:
這是初始化方法
演示二:添加屬性並賦值
class Cat:
def __init__(self):
print("這是初始化方法")
# self.屬性名 = 屬性的初始值
self.name = "Tom"
def eat(self):
print("%s愛吃魚" % self.name)
cat = Cat()
cat.eat()
結果:
這是初始化方法
Tom愛吃魚
初始化的同時設置初始值:
- 把希望設置的屬性值,定義成__init__方法的參數
- 在方法內部使用self.屬性 = 形參 接收外部傳遞的參數。
- 在創建對象時,使用類名(屬性1,屬性2)調用
示例代碼:
class Cat:
def __init__(self,new_name):
print("這是初始化方法")
# self.屬性名 = 屬性的初始值
self.name = new_name
def eat(self):
print("%s愛吃魚" % self.name)
cat = Cat("Tom")
cat.eat()
結果:
這是初始化方法
Tom愛吃魚
3.2 __del__()
__del__()
方法,對象被從內存中銷燬前,會被自動調用
示例代碼:
class Cat:
def __init__(self,new_name):
print("這是初始化方法")
# self.屬性名 = 屬性的初始值
self.name = new_name
def eat(self):
print("%s愛吃魚" % self.name)
def __del__(self):
print("%s走了"%self.name) # 系統會自動調用
cat = Cat("Tom")
cat.eat()
結果爲:
這是初始化方法
Tom愛吃魚
Tom走了
3.3 __str__()
__str__方法,返回對象的描述信息,在方法內部必須返回一個字符串,使用return關鍵字,使用**print(對象名)**輸出,自定義的內容,即return後面的字符串。
希望在程序中輸出對象定義的內容,而不是輸出內存地址。
示例代碼:
class Cat:
def __init__(self,new_name):
print("這是初始化方法")
# self.屬性名 = 屬性的初始值
self.name = new_name
def eat(self):
print("%s愛吃魚" % self.name)
def __del__(self):
print("%s走了"%self.name)
def __str__(self):
return "我是Cat%s"%self.name
cat = Cat("Tom")
print(cat)
print("*"*30)
結果爲:
這是初始化方法
我是CatTom
******************************
Tom走了
代碼解釋:
如果不加入__str__(self):
def __str__(self):
return "我是Cat%s"%self.name
當調用print(cat)時會輸出:
<__main__.Cat object at 0x0000000001F18D30>
4. 實例
- 類創建出來的對象叫做類的實例
- 創建對象的動作叫做實例化
- 對象的屬性叫做實例屬性
- 對象調用的方法叫做實例化方法
在程序執行時:
1.對象各自擁有自己的實例屬性
2.調用對象方法,可以通過self.
每一個對象都有自己獨立的內存空間,保存各自不同的屬性。多個對象的方法,在內存中只有一份,在調用方法時,需要把對象的引用傳遞到方法的內部。
以上所描述的都屬於對象中的內容
Python屬於面向對象的語言,一切皆對象
5. 類是一個特殊的對象
在類中包括也包括屬性和方法,稱:
- 類屬性
- 類屬性就是給類對象定義的屬性,通常用來記錄與這個類相關的特徵,類屬性不會用於記錄具體對象的特徵。
- 類方法
- 類方法就是針對類對象定義的方法
5.1 類屬性
示例一:添加一個類屬性,在實例化方法中調用類屬性: 類名.類屬性
class Tool(object):
count = 0
def __init__(self,name):
self.name = name
#讓類的屬性加 1
Tool.count += 1
# 1.創建工具對象
tool = Tool("斧頭")
tool1 = Tool("榔頭")
print("工具的總數:%d"% tool1.count)
print(Tool.count)
結果:
工具的總數:2
2
調用類屬性的方法
-
類名.類屬性
-
對象名.類屬性(不推薦使用),因爲在Python中存在一個向上查找的機制,如果對象中沒有count屬性,則向上查找類屬性。
注意:
如果使用對象.類屬性 = 值 賦值語句,只會給對象添加一個屬性,而不會影響到類屬性的值。class Tool(object): count = 0 def __init__(self,name): self.name = name #讓類的屬性加 1 Tool.count += 1 # 1.創建工具對象 tool = Tool("斧頭") tool1 = Tool("榔頭") tool1.count = 100 print("工具對象的總數:%d"% tool1.count) print("類屬性%d"% Tool.count) 結果: 工具對象的總數:100 類屬性2
5.2 類方法
語法:
@classmethod
def 類方法名(cls):
pass
描述:類方法需要用修飾器@classmethod來標識,告訴解釋器這是一個類方法。
類方法的第一個參數應該是 cls
-
由哪一個類調用的方法,方法內的cls就是哪一個類的引用。
-
和實例方法中的第一個參數self類似。
-
使用其他名稱也可以,不過習慣使用cls
-
通過類名.調用類方法,不需要傳遞cls參數。
-
在方法內部通過cls.訪問類的屬性。也可以通過cls.調用其他的類的方法。
class Tool(object): # 使用賦值語句定義類屬性,記錄所有工具對象的數量 count = 0 # 定義一個類方法 @classmethod def show_count(cls): print("工具對象的數量%d" % cls.count) def __init__(self,name): self.name = name Tool.count += 1 # 創建工具對象 tool1 = Tool("斧頭") tool2 = Tool("榔頭") # 調用類方法 Tool.show_count() 結果: 工具對象的數量2
5.2.1 靜態方法
既不需要訪問實例屬性或者調用實例方法,也不需要訪問類屬性或者調用類方法
不需要指定第一個參數。靜態方法直接使用類名調用。
語法:
@staticmethod
def 靜態方法名():
pass
示例一:
class Dog(object):
@staticmethod
def run():
print("小狗正在跑")
#通過類名.來調用靜態方法,不需要創建對象
Dog.run()
結果:
小狗正在跑
示例二:
class Game(object):
# 定義一個類屬性——歷史最高分
top_score = 0
def __init__(self,play_name):
self.play_name = play_name
@staticmethod
def show_help():
print("幫助信息")
@classmethod
def show_top_score(cls):
print("歷史記錄%d:" %cls.top_score)
def start_game(self):
print("%s開始了"%self.play_name)
# 1.查看遊戲的幫助信息
Game.show_help()
# 2.查看歷史最高分
Game.show_top_score()
# 3.創建遊戲對象
game = Game("小曾")
game.start_game()
結果:
幫助信息
歷史記錄0
小曾開始了
總結:
1.實例方法——方法內部需要訪問實例屬性
- 實例方法內部可以使用類名.訪問類屬性
2.類方法——方法內部只需要訪問類屬性
3.靜態方法——方法內部,不需要訪問實例屬性和類屬性
問題:
如果方法內部即需要訪問實例屬性,又需要訪問類屬性,應該定義成什麼方法?
- 應該定義成實例方法
- 類只有一個,在實例方法內部可以使用類名.方法類屬性。