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 即导入成功的模块
"""
该方式经常使用在框架中 由于框架设计者不可能提早预知后续须要的模块和类



```
相关文章
相关标签/搜索