Python Day26:多态、封装、内置函数:__str__、__del__、反射(反省)、动态导入模块...
生活随笔
收集整理的這篇文章主要介紹了
Python Day26:多态、封装、内置函数:__str__、__del__、反射(反省)、动态导入模块...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
## 多態 ```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 = nameself.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 runprint(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 = nameself.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 即導入成功的模塊 """ 該方式常用在框架中 因為框架設計者不可能提前預知后續需要的模塊和類```
?
轉載于:https://www.cnblogs.com/huhongpeng/p/10923898.html
總結
以上是生活随笔為你收集整理的Python Day26:多态、封装、内置函数:__str__、__del__、反射(反省)、动态导入模块...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面向对象的特性
- 下一篇: CSS3——对齐 组合选择符 伪类