## 多態 ```python OOP中標準解釋:多個不一樣類型對象,能夠響應同一個方法,併產生不一樣結果,即爲多態 多態好處:只要知道基類使用方法便可,不須要關心具體哪個類的對象實現的, 以不變應萬變,提升靈活性/擴展性 多態,通常都須要一個管理多態的方法,方法的函數就是類的對象,在方法中經過點語法,調用每一個對象的那個相同的方法. ``` ## 封裝: ```python 封裝,便是隱藏類中的一些不能被外界訪問的方法、屬性,封裝語法就是在名稱前加雙下劃線便可。 爲何封裝以後,外界沒法訪問? python中,是經過變形的方式實現封裝的,在名稱帶有雙下滑線的變量名字前添加單下劃線_類名實現的。意味着能夠經過在封裝的屬性、方法前加_類名,可是通常不會這麼作。 #***變形僅在類的定義階段發生一次 後續再添加的帶有雙下劃線的任何屬性都不會變形 就是普通屬性*** @property: 經過property用於訪問私有屬性的值 @property # getter # 用於訪問私有屬性的值 也能夠訪問普通屬性 def salary(self): return self.__salary @salary.setter # 用來設置私有屬性的值 也能夠設置普通屬性 def salary(self,new_salary): self.__salary = new_salary @salary.deleter # 用來設置私有屬性的值 也能夠刪除普通屬性 def salary(self): # print("can not delete salary!") del self.__dict__["_Teacher__salary"] # del self.__salary #再對私有屬性進行增刪改查的時候,會自動調用上面對於的裝飾的方法。 property的另外一種使用場景 計算屬性 什麼是計算屬性 一個屬性 它的值不是固定死的 而是經過計算動態產生的 ``` ## 內置函數__str, del, ```python 類中的__str__ 該方法在object中有定義 默認行爲 返回對象類型以及地址 <__main__.Person object at 0x0000016F450C7390> 在將對象轉爲字符串時執行 在print時也會執行__str__,不然沒法打印 #***注意:返回值必須爲字符串類型*** 子類能夠覆蓋該方法來完成 對打印內容的自定義 例:class Person: def __init__(self,name,age): self.name = name self.age = age # 將對象轉換爲字符串時執行 def __str__(self): print("str run") return "my name is %s , age is %s" %(self.name,self.age) p=Person("rose",20) str(p)#str run print(p)#str run my name is rose , age is 20 類中__del__: 也稱之爲析構函數(構造反義詞,從有到無) 當對象被刪除前會自動調用 該方法 聲明時候會刪除對象? 1.程序運行結束 解釋器退出 將自動刪除全部數據 2.手動調用del 時也會刪除對象 # 假設要求每個person對象都要綁定一個文件 class Person: def __init__(self,name,path,mode="rt",encoding="utf-8"): self.name = name self.file = open(path,mode,encoding=encoding) # 讀取數據的方法 def read_data(self): return self.file.read() def __del__(self): print("del run!") self.file.close() 總結:__del__該函數 用於 在對象刪除前作一些清理操做 ``` ## 反射(檢討): ```python 面向對象中的檢討 指的是,一個對象必須具有,發現自身屬性,以及修改自身屬性的能力; 一個對象在設計初期,可能考慮不夠周全後期須要刪除或修改已經存在的屬性, 和增長屬性 反射就是經過字符串來操做對象屬性 涉及到的方法: hasattr 判斷是否存在某個屬性 hasattr(對象,"字符串"):判斷是否有跟字符串同名的屬性名 getattr 獲取某個屬性的值 getattr(對象,"字符串"):獲取跟字符串同名的屬性值/方法名,這時能夠用變量接受,存放的就是屬性值或者方法的地址。能夠經過該變量執行該方法。 setattr 新增或修改某個屬性 delattr 刪除某個屬性 例: class MY_CMD: def dir(self): os.system("dir") def ipconfig(self): os.system("ipconfig") cmd = MY_CMD() while True: name = input("請輸入要執行的功能:") if hasattr(cmd,name): method = getattr(cmd,name) print(method) method() else: print("sorry this method is not exists....!") ``` ## 動態導入模塊 ```python 直接寫import稱之爲靜態導入 但這創建在一個基礎上:提早已經知道有這個模塊 動態導入 指的是 在須要的任什麼時候候 經過指定字符串類型的包名稱來導入須要的模塊 import importlib mk = importlib.import_module(m_name) #m_name 是一個表明模塊路徑的字符串,如:"build_house.my_decoration.Light" mk 即導入成功的模塊 """ 該方式經常使用在框架中 由於框架設計者不可能提早預知後續須要的模塊和類 ```