天天看點

python面向對象基礎-封裝

作者:黑馬金牌程式設計

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_():删除對象時調用

注意:魔法方法不需要手動調用,它預設會自動調用。

python面向對象基礎-封裝