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 = 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 即導入成功的模塊
"""
該方式經常使用在框架中 由於框架設計者不可能提早預知後續須要的模塊和類



```
相關文章
相關標籤/搜索