目錄特性
封裝就是將東西裝起來封好,只要我不告訴你裡面有什麼,你就不知道。
在 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...