博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python Day26:多态、封装、内置函数:__str__、__del__、反射(反省)、动态导入模块...
阅读量:4639 次
发布时间:2019-06-09

本文共 2843 字,大约阅读时间需要 9 分钟。

## 多态```pythonOOP中标准解释:多个不同类型对象,可以响应同一个方法,并产生不同结果,即为多态多态好处:只要知道基类使用方法即可,不需要关心具体哪一个类的对象实现的,    以不变应万变,提高灵活性/扩展性多态,一般都需要一个管理多态的方法,方法的函数就是类的对象,在方法中通过点语法,调用每个对象的那个相同的方法.```## 封装:```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 importlibmk = importlib.import_module(m_name) #m_name 是一个代表模块路径的字符串,如:"build_house.my_decoration.Light"mk 即导入成功的模块"""该方式常用在框架中 因为框架设计者不可能提前预知后续需要的模块和类```

 

转载于:https://www.cnblogs.com/huhongpeng/p/10923898.html

你可能感兴趣的文章
网络流24题-飞行员配对方案问题
查看>>
Jenkins 2.16.3默认没有Launch agent via Java Web Start,如何配置使用
查看>>
引入css的四种方式
查看>>
iOS开发UI篇—transframe属性(形变)
查看>>
3月7日 ArrayList集合
查看>>
jsp 环境配置记录
查看>>
Python03
查看>>
LOJ 2537 「PKUWC2018」Minimax
查看>>
使用java中replaceAll方法替换字符串中的反斜杠
查看>>
Some configure
查看>>
json_encode时中文编码转正常状态
查看>>
流量调整和限流技术 【转载】
查看>>
Axure 全局辅助线(转)
查看>>
正由另一进程使用,因此该进程无法访问此文件。
查看>>
1 线性空间
查看>>
VS不显示最近打开的项目
查看>>
MyEclipse安装Freemarker插件
查看>>
计算多项式的值
查看>>
DP(动态规划)
查看>>
chkconfig
查看>>