python面向對象基礎-封裝
面向對象三大特性
封裝
将屬性和方法寫到類的裡面的操作即為封裝
封裝可以為屬性和方法添加私有權限
繼承
子類預設繼承父類的所有屬性和方法
子類可以重寫父類屬性和方法
多态
傳入不同的對象,産生不同的結果
面向對象就是将程式設計當成一個事務,對外界來說,事務是直接使用,不用去管他内部的情況。而程式設計就是設定事務能夠做什麼事。
類
類是對一系列具有相同特征和行為的事務的統稱,是一個抽象的概念,不是真實存在的事務。類是用來建立對象的。
1、特征即是屬性
2、行為即是方法
文法:
class obj():
代碼
....
注意:類名要滿足辨別符命名規則,同時遵循大駝峰命名規則
對象
對象(執行個體)是類建立出來的真實存在的事物。
文法:
對象名 = 類名()
示例:
#需求:洗衣機,功能:洗衣服
#定義洗衣機類
class Washer():
def wash(self):
print("能洗衣服")
#建立對象
haier = Washer()
#3.驗證成果
#使用wash功能 --執行個體方法/對象方法 -- 對像名.Wash()
#類裡面定義的函數稱為執行個體方法
haier.wash()
注意:類裡面定義的函數稱為執行個體方法
類裡面的self參數
class Washer():
def wash(self):
print('洗衣服')
print(self)
haier = Washer()
print(haier)
haier.wash()
#
結論
由于列印對象和列印self得到的記憶體位址相同,是以self指的是調用該函數的對象
案例測試
1.一個類可以建立多個對象?——可用
2.多個對象都調用函數的時候,self位址相同——不同
# 1.一個類可以建立多個對象
#2.多個對象都調用函數的時候,self位址相同
class Washer():
def wash(self):
print('洗衣服')
print(self)
harer1 = Washer()
harer1.wash()
harer2 = Washer()
harer2.wash()
添加和擷取對象屬性
屬性即使特征,比如:洗衣機的寬度、高度、重量....
對象屬性既可以在類外面添加和擷取,也能在類裡面添加和擷取。
類外面添加對象屬性
文法
對象名.屬性名 = 值
類外面擷取對象屬性
文法
對象名.屬性名
案例體驗
class Washer():
def wash(self):
print('洗衣服')
haier1 = Washer()
# 對象名.屬性名 = 值
haier1.width = 400
haier1.height = 500
#對象名.屬性名
print(f'haier1洗衣機的寬度是{haier1.width}')
print(f'haier1洗衣機的高度是{haier1.height}')
類裡面擷取對象屬性
#定義類
class Washer():
def wash(self):
print('洗衣機')
def print_info(self):
#self.屬性名
# print(self.width)
# print(self.height)
print(f'洗衣機的寬度{self.width}')
print(f'洗衣機的高度{self.height}')
haier1 = Washer()
#添加屬性
haier1.width = 400
haier1.height = 500
haier1.wash()
#對象調用方法
haier1.print_info()
魔法方法
在python中,_xx_()的函數叫做魔法方法,指的是具有特殊功能的函數。
_init_()方法的作用:初始化對象
#目标:定義init魔法方法設定初始化屬性 并通路調用
"""
1.定義類
init魔法方法:width 和 height
添加執行個體方法:通路執行個體屬性
2.建立對象
3.驗證成果
"""
class Washer():
def __init__(self):
#添加執行個體屬性
self.width = 500
self.height = 800
def print_info(self):
print(f'洗衣機的寬度是{self.width}')
print(f'洗衣機的寬度是{self.height}')
haier = Washer()
haier.print_info()
注意:
_init_()方法,在建立一個對象時預設被調用,不需要手動調用。
_init_(self)中的self參數,不需要開發者傳遞,python解釋器會自動把目前的對象引用傳遞過去。
帶參數的_init_()
當一個類需要建立多個對象,需要對不同對象設定不同的初始值屬性時,可以使用傳參的方式實作。
#1.定義類:帶參數的init:寬度和高度:執行個體方法:調用執行個體屬性
class Washer():
def __init__(self,width,height):
self.widht = width
self.height = height
def print_info(self):
print(f'洗衣機的寬度{self.widht},洗衣機的高度{self.height}')
#2.建立對象,建立多個對象且屬性值不同:調用執行個體方法
haier1 = Washer(10,20)
haier1.print_info()
haier2 = Washer(100,200)
haier2.print_info()
_str_()
當使用print輸出對象打的時候,預設列印對象的記憶體位址。如果類定義了_str_方法,那麼就會列印從在這個方法中return的資料。
class Washer():
def __init__(self):
self.width = 300
def __str__(self):
return '解釋說明:類的說明或對象狀态的說明'
haier = Washer()
print(haier) #解釋說明:類的說明或對象狀态的說明
_del_()
當删除對象時,python解釋器也會預設調用_del_()_方法
class Washer():
def __init__(self):
self.width = 300
#自動調用
def __del__(self):
print('對象一已經删除')
haier = Washer()
面向對象綜合應用
1.烤地瓜
需求:
1.被烤的時間和對應的地瓜狀态
0-3分鐘:生的
3-5分鐘:半生熟
5-8分鐘:熟的
超過8分鐘:烤糊了
2.添加調料
使用者按自己的意願添加調用
步驟分析
定義類
地瓜的屬性
被烤的時間
地瓜的狀态
添加的調料
地瓜的方法
被烤
使用者根據意願設定每次烤地瓜的時間
判斷地瓜被烤的總時間是在哪個區間,修改地瓜狀态
添加調料
使用者根據意願設定添加的調料
将使用者添加的調料存儲
顯示對象資訊
#1.定義類:初始化屬性、被烤和添加調料的方法、顯示對象資訊的str
class SweetPotato():
def __init__(self):
#定義屬性:成員變量
#被烤的時間
self.cook_time = 0
#烤的狀态
self.cook_state = '生的'
#調料清單
self.condiments = []
#定義方法:成員函數
def cook(self,time):
"""烤地瓜方法"""
#1.先計算地瓜整體考過的時間
self.cook_time += time
#2.用整體烤過的時間在判斷地瓜的狀态
if 0 <= self.cook_time < 3:
#生的
self.cook_state = '生的'
elif 3 <= self.cook_time <5:
#半生不熟
self.cook_state = '半生不熟'
elif 5 <= self.cook_time < 8:
#熟了
self.cook_state = '熟了'
elif self.cook_time >= 8:
#烤糊了
self.cook_state = '烤糊了'
def add_condiments(self,condiment):
#使用者意願的調料追加到調料清單
self.condiments.append(condiment)
def __str__(self):
return f'這個地瓜的被烤過的時間是{self.cook_time}分鐘,' \
f'狀态是{self.cook_state},調料有{self.condiments}'
#2.建立對象并調用對應的執行個體方法
digua1 = SweetPotato()
print(digua1)
digua1.cook(2)
digua1.add_condiments('辣椒')
print(digua1)
#多次調用測試時間是否相加
digua1.cook(2)
digua1.add_condiments('醬油')
print(digua1)
2.搬家具
需求
将小于房子剩餘面積的家具擺放到房子中
步驟分析
需求涉及兩個事務:房子和家具,故該案例涉及兩個類:房子類和家具類
定義房子類
執行個體屬性
房子地理位置
房子占地面積
房子剩餘面積
房子内家具清單
執行個體方法
容納家具
顯示房屋資訊
定義家具類
家具名稱
家具占地面積
建立對象并調用相關方法
#家具類
class Furniture():
def __init__(self,name,area):
#家具名字
self.name = name
#家具占地面積
self.area = area
#定義房屋類
class Home():
def __init__(self,address,area):
#地理位置
self.address = address
#房屋面積
self.area = area
#剩餘面積
self.free_area = area
#家具清單
self.furniture = []
def __str__(self):
return f'房子地理位置在{self.address},' \
f'房屋面積是{self.area},剩餘面積{self.free_area},家具有{self.furniture}'
def add_furniture(self,item):
"""容納家具"""
#如果 家具占地面積 <= 房子剩餘面積: 可以搬入(家具清單添加家具名字資料并将房子剩餘面積更新:
# 房屋剩餘面積 - 該家具的占地面積
# 否則:提示使用者家具太大,剩餘面積不足,無法容納
# )
if item.area <= self.free_area:
self.furniture.append(item.name)
self.free_area -= item.area
else:
print('使用者家具太大,剩餘面積不足,無法容納')
#雙人床, 6
bed = Furniture('雙人床',6)
sofa = Furniture('沙發',10)
#房子1:北京 2.上海
jia1 = Home('北京',1000)
print(jia1)
#開始般家具
jia1.add_furniture(bed)
print(jia1)
ball = Furniture('遊泳池',2000)
jia1.add_furniture(ball)
print(jia1)
面向對象基礎總結
類
建立類
class 類名():
代碼
對象
對象名 = 類名()
添加對象屬性
類外面
對象名 = 類名
類裡面
self.屬性名 = 值
擷取對象屬性
類外面
對象名.屬性名
類裡面
self.屬性名
魔法方法
_init_():初始化
_str_():輸出對象資訊
_del_():删除對象時調用
注意:魔法方法不需要手動調用,它預設會自動調用。