day22-面向对象之封装
生活随笔
收集整理的這篇文章主要介紹了
day22-面向对象之封装
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
# 封裝
什么是封裝?
# 就是將復雜的丑陋的,隱私的細節隱藏到內部,對外提供簡單的使用接口 # 對外隱藏內部實現細節,并提供訪問的接口為什么需要封裝?
? # 兩個目的 ? 1.為了保證關鍵數據的安全性 ? 2.對外部隱藏實現細節,隔離復雜度什么時候應該封裝?
#? 當有一些數據不希望外界可以直接修改時 #? 當有一些函數不希望給外界使用時如何使用?
語法:
class Person:def __init__(self,id_number,name,age)self.__id_number = id_numberself.name = nameself.age = agep = Person("1111111111111","jack",29)p.id_number = "222"?被封裝的內容的特點:
# 1.外界不能直接訪問 # 2.內部依然可以使用權限
學習了封裝后就可以控制屬性的權限 在python只要兩種權限, # 1.公開的.默認就是公開的 # 2.私有的,只能由當前類自己使用 在外界訪問私有的內容 屬性雖然被封裝了,但是還是需要使用的,在外界如何訪問 通過定義方法類完成對私有屬性的修改和訪問案例:
""" 定義一個下載器類,需要提供一個緩存大小這樣的屬性,緩存大小不能超過內存限制 """ class Downloader:def __init__(self,filename,url,buffer_size):self.filename = filenameself.url = urlself.__buffer_size= buffer_sizedef start_download(self):if self.__buffer_size <= 1024*1024:print("開始下載....")print("當前緩沖器大小",self.__buffer_size)else:print("內存炸了! ")def set_buffer_size(self,size):#可以在方法中添加額外的邏輯if not type(size) == int:print("大哥 緩沖器必須是整型")else:print("緩沖區大小修改成功!")self.__buffer_size = sizedef get_buffer_size(self):return self.__buffer_sized = Downloader("葫蘆娃","http://www.baicu.com",1024*1024)# 通過函數取修改內部封裝的屬性 d.set_buffer_size(1024*512)# 通過函數訪問內部封裝的屬性 print(d.get_buffer_size())d.start_download()這樣一來我們可以在外界修改這個關鍵數據時,做一些限制
property裝飾器
通過方法來修改或訪問屬性,本身沒什么問題,但是這給對象的使用者帶來了麻煩. 使用必須知道哪些是普通屬性,哪些是私有屬性,需要使用不同的方式來調用他們 # property裝飾就是為了使得調用方式一致有三個相關的裝飾器
# 1.property 該裝器用在獲取屬性的方法上 # 2.@key.setter 該裝器用在修改屬性的方法上 # 3.@key.deleter 該裝器用在刪除屬性的方法上 注意:key是被property裝飾的方法的名稱 也就是屬性的名稱 內部會創建一個對象 變量名稱就是函數名稱 所以在使用setter和deleter時 必須保證使用對象的名稱取調用方法 所以是 key.setter案例:
class A:def __init__(self,name,key):self.__name = nameself.__key = key@property def key(self):return self.__key@key.setter def key(self,new_key):if new_key <= 100:self.__key = new_keyelse:print("key 必須小于等于100")@key.deleter def key(self):print("不允許刪除該屬性")del self.__keya = A("jack",123)print(a.key)a.key = 321print(a.key)
python實現封裝的原理
# 就是在加載類的時候,把__替換成了 _類名__,python一般不會強制要求程序必須怎么怎么的封裝:
對外部隱藏內部的實現細節,并提供訪問的接口好處: # 1.提高安全性 # 2.隔離復雜度 語法:將要封裝的屬性或方法名稱前加上雙下劃線 訪問被隱藏的屬性: # 提供用于訪問和修改的方法 使用property裝飾器可以將一個方法偽裝成普通順屬性,報紙屬性之間調用方法一致 封裝的實現原理 ,替換變量名稱property 可以用來實現計算屬性
計算屬性指的是:屬性的值,不能直接獲得,必須通過計算才能獲取例如:正方形求面積# 接口 了解
接口是一組功能的集合,但是接口中僅包含功能的名字,不包含具體的實現代碼 接口本質是一套協議標準,遵循這個標準的對象就能被調用 接口目的就是為了提高擴展性: 例如電腦提前指定制定一套USB接口協議,只要你遵循該協議,你的設備就可以被電腦使用,不需要關心到底是鼠標還是鍵盤案例: class USB:def open(self):passdef close(self):passdef read(self):passdef write(self):passclass Mouse(USB):def open(self):print("鼠標開機.....")def close(self):print("鼠標關機了...")def read(self):print("獲取了光標位置....")def write(self):print("鼠標不支持寫入....")def pc(usb_device):usb_device.open()usb_device.read()usb_device.write()usb_device.close()m = Mouse() # 將鼠標傳給電腦 pc(m)class KeyBoard(USB):def open(self):print("鍵盤開機.....")def close(self):print("鍵盤關機了...")def read(self):print("獲取了按鍵字符....")def write(self):print("可以寫入燈光顏色....")# 來了一個鍵盤對象 k = KeyBoard() pc(k) ```在上述案例中,PC的代碼一旦完成,后期無論什么樣的設備 只要遵循了USB接口協議,都能夠被電腦所調用 接口主要是方便了對象的使用者,降低使用者的學習難度,只要學習一套使用方法,就可以以不變應萬變 問題:如果子類沒有按照你的協議來設計,也沒辦法限制他,將導致代碼無法運行# 抽象類
指的是包含抽象方法(沒有函數體的方法)的類, 作用:可以限制子類必須類中定義的抽象方法最后:python一般不會限制你必須怎么寫,作為一個優秀的程序員,就應該自覺遵守相關協議 所以有了鴨子類型這么一說: 如果這個對象長得像鴨子,走路像鴨子,那就他是鴨子 你只要保證你的類按照相關的協議類編寫,也可以達到提高擴展性的目的案例:
class Mouse:def open(self):print("鼠標開機.....")def close(self):print("鼠標關機了...")def read(self):print("獲取了光標位置....")def write(self):print("鼠標不支持寫入....")def pc(usb_device):usb_device.open()usb_device.read()usb_device.write()usb_device.close()m = Mouse() # 將鼠標傳給電腦 pc(m)class KeyBoard:def open(self):print("鍵盤開機.....")def close(self):print("鍵盤關機了...")def read(self):print("獲取了按鍵字符....")def write(self):print("可以寫入燈光顏色....")# 來了一個鍵盤對象 k = KeyBoard() pc(k)class UDisk:def open(self):print("U盤啟動了...")def close(self):print("U盤關閉了...")def read(self):print("讀出數據")def write(self):print("寫入數據")u = UDisk() pc(u)接口是一套協議規范,明確子類們應該具備哪些功能
# 抽象類是用于強制要求子類必須按照協議中規定的來實現 然而,python不推崇限制你的語法, 我們可以設計成鴨子類型,既讓多個不同類對象具備相同的屬性和方法 對于使用者而言,就可以以不變應萬變,輕松的使用各種對象?
1.封裝
2.好處
3.語法
4.原理
5.訪問私有屬性的方法 property裝飾器
6.計算屬性
7.接口
8.抽象類
9.鴨子類型
轉載于:https://www.cnblogs.com/Ryan-Yuan/p/11251122.html
總結
以上是生活随笔為你收集整理的day22-面向对象之封装的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Swift通天遁地]五、高级扩展-(4
- 下一篇: day28 socket网络编程