面向對象是一個編程思想(寫代碼的套路)
編程思想:
1. 面向過程
2. 面向對象
以上兩種都屬於寫代碼的套路(方法) ,最終目的都是為了將代碼書寫出來,只不過過程和思考方法不太一樣.
面向對象的核心思想是 找一個對象去幫我們處理事情
在程序代碼中 對象是由 類 創建的
類和對象,是 面向對象編程思想中非常重要的兩個概念
蘋果 ---> 類
紅蘋果 ----> 類
張三嘴裡正在吃的那個蘋果 ---> 對象
1, 類名 (給這多個事物起一個名字, 在代碼中 滿足大駝峰命名法(每個單詞的首字母大寫))
2, 屬性 (事物的特征, 即有什麼, 一般文字中的名詞)
3, 方法 (事物的行為, 即做什麼事, 一般是動詞)
類的抽象,其實就是找到 類的 類名, 屬性 和方法
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-KUfuVebK-1658062462995)(E:\04、python\day06_函數和面向對象基礎\01-筆記\day06 筆記.assets\A5DC4783-CC1A-4B89-9F2A-25AC16B49D77.png)]
類名: 人類(Person, People)
屬性: 名字(name), 年齡(age), 身高(height)
方法: 跑步(run) 吃(eat)
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-mxxWvVhW-1658062462996)(E:\04、python\day06_函數和面向對象基礎\01-筆記\day06 筆記.assets\A424818D-3279-4899-99F4-ED8ED8D68263.png)]
類名: 狗類(Dog)
屬性: 顏色(color) , 名字(name)
方法: 汪汪叫 (bark), 搖尾巴(shake)
先定義簡單的類, 不包含屬性, 在 python 中定義類需要使用關鍵字 class
方法: 方法的本質是在類中定義的函數, 只不過,第一個參數是 self
class 類名:
# 在縮進中書寫的內容,都是類中的代碼
def 方法名(self): # 就是一個方法
pass
創建對象是使用 類名() 進行創建,即
類名() # 創建一個對象, 這個對象在後續不能使用
# 創建的對象想要在後續的代碼中繼續使用, 需要使用一個變量,將這個對象保存起來
變量 = 類名() # 這個變量中保存的是對象的地址, 一般可以成為這個變量為對象
# 一個類可以創建多個對象, 只要出現 類名() 就是創建一個對象,每個對象的地址是不一樣的
對象.方法名()
列表.sort()
列表.append()
需求:小貓愛吃魚,小貓要喝水
類名: 貓類 Cat
屬性: 暫無
方法: 吃魚 (eat) 喝水 (drink )
""" 需求:小貓愛吃魚,小貓要喝水, 定義不帶屬性的類 """
class Cat:
# 在縮進中書寫 方法
def eat(self): # self 會自動出現,暫不管
print('小貓愛吃魚...')
def drink(self):
print('小貓要喝水----')
# 2. 創建對象
blue_cat = Cat()
# 3. 通過對象調用類中的方法
blue_cat.eat()
blue_cat.drink()
# 創建對象
black_cat = Cat()
black_cat.eat()
black_cat.drink()
Cat() # 是
a = black_cat # 不是
b = Cat # 不是
class Cat:
# 在縮進中書寫 方法
def eat(self): # self 會自動出現,暫不管
print('小貓愛吃魚...')
black_cat.eat()
1. 從函數的語法上講, self是形參, 就可以是任意的變量名, 只不過我們習慣性將這個形參寫作 self
2. self 是普通的形參, 但是在調用的時候沒有傳遞實參值, 原因是, Python 解釋器在執行代碼的時候, 自動的將調用這個方法的對象 傳遞給了 self, 即 self 的本質是對象
3. 驗證, 只需要確定 通過哪個對象調用, 對象的引用和 self 的引用是一樣的
4. self 是函數中的局部變量, 直接創建的對象是全局變量
""" 需求:小貓愛吃魚,小貓要喝水, 定義不帶屬性的類 """
class Cat:
# 在縮進中書寫 方法
def eat(self): # self 會自動出現,暫不管
print(f'{
id(self)}, self')
print('小貓愛吃魚...')
# 2. 創建對象
blue_cat = Cat()
print(f'{
id(blue_cat)}, blue_cat')
# 3. 通過對象調用類中的方法
blue_cat.eat() # blue_cat 對象調用 eat 方法, 解釋器就會將 blue_cat 對象傳給 self
print('_*_' * 30)
# 創建對象
black_cat = Cat()
print(f"{
id(black_cat)}, black_cat")
black_cat.eat() # black_cat 對象調用 eat 方法, 解釋器就會將 black_cat 對象傳給 self
對象.屬性名 = 屬性值
類內部添加
在內部方法中, self 是對象,
self.屬性名 = 屬性值
# 在類中添加屬性一般寫在 __init__ 方法中
類外部添加
對象.屬性名 = 屬性值 # 一般不使用
對象.屬性名
類內部
在內部方法中, self 是對象,
self.屬性名
類外部
對象.屬性名 # 一般很少使用
class Cat:
# 在縮進中書寫 方法
def eat(self): # self 會自動出現,暫不管
print(f'{
id(self)}, self')
print(f'小貓{
self.name} 愛吃魚...')
# 2. 創建對象
blue_cat = Cat()
print(f'{
id(blue_cat)}, blue_cat')
# 給 藍貓添加 name 屬性
blue_cat.name = '藍貓'
# 3. 通過對象調用類中的方法
blue_cat.eat() # blue_cat 對象調用 eat 方法, 解釋器就會將 blue_cat 對象傳給 self
print('_*_' * 30)
# # 創建對象
black_cat = Cat()
black_cat.name = '黑貓'
print(f"{
id(black_cat)}, black_cat")
black_cat.eat() # black_cat 對象調用 eat 方法, 解釋器就會將 black_cat 對象傳給 self
python 中有一類方法, 以兩個下劃線開頭,兩個下劃線結尾,並且在滿足某個條件的情況下, 會自動調用, 這類方法稱為 魔法方法
學習:
1. 什麼情況下自動調用
2. 有什麼用, 用在哪
3. 書寫的注意事項
__init__ 方法 **
1. 什麼情況下自動調用
> 創建對象之後會自動調用
2. 有什麼用, 用在哪
> 1. 給對象添加屬性的, (初始化方法, 構造方法) 2. 某些代碼, 在每次創建對象之後, 都要執行,就可以將這行代碼寫在 __init__ 方法
3. 書寫的注意事項
> 1. 不要寫錯了 2. 如果 init 方法中,存在出了 self 之外的參數, 在創建對象的時候必須傳參
""" 貓類, 屬性 name, age , show_info(輸出屬性信息) """
class Cat:
# 定義添加屬性的方法
def __init__(self, name, age): # 這個方法是創建對象之後調用
self.name = name # 給對象添加 name 屬性
self.age = age # 給對象添加 age 屬性
# 輸出屬性信息
def show_info(self):
print(f'小貓的名字是: {
self.name}, 年齡是: {
self.age}')
# 創建對象,不要在自己類縮進中創建
# Cat() # 創建對象 ,會輸出
blue_cat = Cat('藍貓', 2)
blue = blue_cat
blue.show_info()
# 創建黑貓
black_cat = Cat('黑貓', 3)
black_cat.show_info()
__str__ 方法 *
1. 什麼情況下自動調用
> 使用 print(對象) 打印對象的時候 會自動調用
2. 有什麼用, 用在哪
> 在這個方法中一般書寫對象的 屬性信息的, 即打印對象的時候想要查看什麼信息,在這個方法中進行定義的
> 如果類中沒有定義 __str__ 方法, print(對象) ,默認輸出對象的引用地址
3. 書寫的注意事項
> 這個方法必須返回 一個字符串
class Cat:
# 定義添加屬性的方法
def __init__(self, n, age): # 這個方法是創建對象之後調用
self.name = n # 給對象添加 name 屬性
self.age = age # 給對象添加 age 屬性
def __str__(self):
# 方法必須返回一個字符串, 只要是字符串就行,
return f'小貓的名字是: {
self.name}, 年齡是: {
self.age}'
# 創建對象,不要在自己類縮進中創建
# Cat() # 創建對象 ,會輸出
blue_cat = Cat('藍貓', 2)
print(blue_cat)
# 創建黑貓
black_cat = Cat('黑貓', 3)
print(black_cat)
__del__ 方法
[了解]__init__ 方法, 創建對象之後,會自動調用 (構造方法)
__del__ 方法, 對象被刪除銷毀時, 自動調用的(遺言, 處理後事) (析構方法)
1. 調用場景, 程序代碼運行結束, 所有對象都被銷毀
2. 調用場景, 直接使用 del 刪除對象(如果對象有多個名字(多個對象引用一個對象),需要吧所有的對象都刪除才行 )
class Demo:
def __init__(self, name):
print('我是 __init__, 我被調用了 ')
self.name = name
def __del__(self):
print(f'{
self.name} 沒了, 給他處理後事...')
# Demo('a')
a = Demo('a')
b = Demo('b')
del a # 刪除銷毀 對象,
print('代碼運行結束')