Python 初學筆記 第四章 類的封裝

2022-07-14 10:09:09 字數 4232 閱讀 5602

目錄特性

封裝就是將東西裝起來封好,只要我不告訴你裡面有什麼,你就不知道。

在 python 中用雙下劃線開頭的方式將屬性隱藏起來(其實是設定成私有屬性)。

其實這僅僅這是一種變形操作,類中所有雙下劃線開頭的名稱如 __x 在類的定義階段都會自動變形成: _類名__x 的形式。

class a:

__name = 'a'

def __info(self):

print(self.__name)

a = a()

# print(a.__name) # 這樣呼叫會報錯

print(a._a__name)

a
這種自動變形的特點:

這種變形需要注意的問題是:

class a:

__name = 'a' # 變為 _a__name = 'a'

def __info(self): # 變為 _a__info

print(self.__name)

def call(self): # 在a中呼叫 __info,其實是在呼叫 _a__info

self.__info()

class b(a):

__name = 'b' # 變為 _b__name = 'b'

def __info(self): # 變為 _b__info

print(self.__name)

a.__name = 'aa' # 類定義後賦值操作不會變形,因為變形是在定義階段完成的

print(a.__name)

print(a._a__name) # 私有屬性並不是不可訪問的,只要知道變形規則就能訪問到

b = b()

b.call() # 子類和父類都定義了__info,但是變形後名字其實是不同的,所以子類無法覆蓋

aa

aa

將資料隱藏起來這不是目的,隱藏起來然後對外提供操作該資料的介面,然後我們可以在介面附加上對該資料操作的限制,以此完成對資料屬性操作的嚴格控制,這樣能規範使用者的行為。

class teacher:

def __init__(self, name, age):

"""明確區分內外屬性

"""self.__name = name

self.__age = age

def tell_info(self):

"""定義乙個查詢介面,控制外部對內部隱藏屬性的操作行為,不能隨意的像公共屬性那樣obj.name呼叫檢視

"""print('姓名:%s,年齡:%s' % (self.__name, self.__age))

def set_info(self, name, age):

"""定義乙個修改介面,控制外部對內部隱藏屬性的操作行為,不能隨意的像公共屬性那樣obj.name=name修改

"""if not isinstance(name, str):

raise typeerror('姓名必須是字串型別')

if not isinstance(age, int):

raise typeerror('年齡必須是整型')

self.__name = name

self.__age = age

t = teacher('egg', 18)

t.tell_info()

t.set_info('egg', 19)

t.tell_info()

姓名:egg,年齡:18

姓名:egg,年齡:19

封裝方法:目的是隔離複雜度

取款是功能,而這個功能有很多功能組成:插卡、密碼認證、輸入金額、列印賬單、取錢,對使用者來說,只需要知道取款這個功能即可,其餘功能我們都可以隱藏起來,很明顯這麼做隔離了複雜度,同時也提公升了安全性。

class atm:

def __card(self):

print('插卡')

def __auth(self):

print('使用者認證')

def __input(self):

print('輸入取款金額')

def __print_bill(self):

print('列印賬單')

def __take_money(self):

print('取款')

def withdraw(self): # 使用者只需要知道這個方法就可以了,不需要了解其他方法

self.__card()

self.__auth()

self.__input()

self.__print_bill()

self.__take_money()

a = atm()

a.withdraw()

插卡

使用者認證

輸入取款金額

列印賬單

取款

封裝在於明確區分內外,使得類實現者可以修改封裝內的東西而不影響外部呼叫者的**,而外部使用用者只知道乙個介面(函式),只要介面(函式名)

引數不變,使用者的**永遠無需改變,這就提供乙個良好的合作基礎,或者說,只要介面這個基礎約定不變,則**改變不足為慮。

property 將函式屬性像資料屬性一樣呼叫

setter 當被賦值的時候呼叫被 property 裝飾的同名函式

deleter 當被刪除的時候呼叫

property 是一種特殊的屬性,訪問它時會執行一段功能(函式)然後返回值。

class a:

def __init__(self, name):

self.__name = name

@property # 不需要像函式屬性一樣呼叫,裝飾像資料屬性一樣去呼叫

def say_hi(self):

print('呼叫時執行')

return 'hi', self.__name # 需要有返回值才能像資料屬性一樣使用

jack = a('jack')

print(jack.say_hi)

呼叫時執行

('hi', 'jack')

需要在使用 property 後才能使用,設定值時呼叫。

class a:

def __init__(self, name):

self.__name = name

@property # 不需要像函式屬性一樣呼叫,裝飾像資料屬性一樣去呼叫

def say_hi(self):

print('呼叫時執行')

return 'hi', self.__name # 需要有返回值才能像資料屬性一樣使用

@say_hi.setter

def say_hi(self, name):

print('賦值時執行')

self.__name = name

jack = a('jack')

jack.say_hi = 'lisa'

print(jack.say_hi)

賦值時執行

呼叫時執行

('hi', 'lisa')

需要在使用 property 後才能使用,刪除屬性時呼叫。

class a:

def __init__(self, name):

self.__name = name

@property # 不需要像函式屬性一樣呼叫,裝飾像資料屬性一樣去呼叫

def say_hi(self):

print('呼叫時執行')

return 'hi', self.__name # 需要有返回值才能像資料屬性一樣使用

@say_hi.setter

def say_hi(self, name):

print('賦值時執行')

self.__name = name

@say_hi.deleter

def say_hi(self):

print('刪除時執行')

del self.__name

jack = a('jack')

del jack.say_hi

刪除時執行

第四章筆記

一.引入樣式 1.行內樣式表 2.內部樣式表 在head標籤裡面,title標籤下面 優點方便在同頁面中修改樣式 缺點不利於在多頁面間共享復用 及維護,對內容與樣式的分離也不夠徹底 3.外部樣式表 嵌入式匯入式 嵌入式和匯入式的區別 1.標籤屬於xhtml,import是屬於css2.1 2.使用鏈...

第四章筆記

氣泡排序 從大到小 基本思想 兩層迴圈來完成,每一輪比較之後,把最小數沉到陣列的末尾,之後進行下一輪的比較,比較的次數減少一次,因為最後的數字已經是最小 外層迴圈控制比較的輪數,陣列的長度減一次 內層迴圈進行比較。int testarr for int i 1 i testarr.length 1 ...

第四章 python學習筆記

1 字典 字典是由 鍵值對 組成的無序可變序列 字典中每個元素都是乙個鍵值對 包含乙個 鍵物件 和乙個 值物件 鍵 是任意不可變資料 一般由 整數 浮點數 字串 元組 組成 鍵 在字典中是唯一的 不能重複 否則會被覆蓋 建立字典的方法 1 a 2 a dict name dafu age 18,jo...