打赏

Python基础(26)——类的多态、封装、反射

多态

由不同的类实例化得到的对象,分别调用自己类中的同名方法,不同的对象调用相同的方法,但是执行的结果或者说表现出来的结果是一样的。比如len()对于字符串、列表、元组等不通类的数据类型,得到的结果看起来没什么区别,都是调用了各自类中的len函数属性

具体同一个方法会判断对象的属性做出不通的结果,这个叫多态

误解:由一个类实例化后不同对象的结果-多态,是错误的。。。。。不过前面的解释需要求证。

多态实际上是继承的实现细节

封装

1、类本身就是封装 2、封装有隐藏的意思,可以用,但是看不到里面的代码,Python里并不是完全的看不到,只是用了一种语言的约定来规定。3、内部逻辑实现,对外部完全屏蔽。用get()调用方法来查找内部的属性,内部调用。明确区分内外

 单下划线_star  类的私有属性,可以访问,但是是个语言规定的私有属性,不允许外部调用

双下划线__star   Python会自动把双下划线的属性重新命名 _类__star  前面加类的名字  规定私有也只是约定

最彻底的封装是,在内部调用属性,提供接口函数(访问函数)给外面,间接访问,实现内外区分。外部就是调用,不需要知道内部实现

继承、多态和封装实际上是一种编程思想,是一种道的层面,是一种特性。面向对象是更高的结构化编程方式,通过封装明确了内外,内部实现与外部调用分开;继承和多态支持了归一化设计(Linux中的一切皆文件就是归一化设计),实现类并一定就是懂设计,设计是不被迷惑的归一化,最终编程艺术

面向对象OOP常用术语

抽象:一类事物的公共数据属性和动作属性的模型

实现:实例化

合成:组合,就是建立关联

派生:继承后子类的新特性

反射 程序自己的增删改查

主要是指程序可以访问、检测、修改自身状态或者行为的一种能力(自省) 要注意双引号

hasattr(对象,属性) hasattr(b1,"name")   检测b1对象中是否有name属性,就是检测b1.name是否能用

getattr得到属性值,可以在没有的时候加提示、setattr设置属性、delattr删除属性

以上的功能其实就是判断  b1.name 的各种方法

反射的好处就是先定义好接口,接口只有在真正完成后才会真执行,但是另外的人可以先判断有没有接口,继续自己的工作,使用者判断如果有这个方法就执行,没有就执行别的。这个叫可插拔设计,即插即用。

动态导入模块

import 字符串       的话会报错

则用__import__(m.text)   这个拿到的是m的空间,调用的话还是要经过m  ,m.text.text1

import  importlib    

importlib.import_module('m.test')   这个可以拿到的是test的空间 可以直接调用

双下划线开头并结尾的attr 方法,定义在类的内部

__getattr__     在外面直接有getattr()  ,只有查找的方法不存在的时候才会被执行,有的话直接返回

__delattr__   执行删除delattr()时就会执行

__setattr__   当设置属性的时候会自动触发自己,那么会进入死循环,所以设置属性要用self.__dict__["key"]=value 来设置,否则会报错,所以这里引出来一个问题,定义类的时候,实际上Python也会自动继承了上一层的父类,也自动包含了许多方法,双下划线开头和结尾的方法都会被自动执行,实例化的时候会执行这些方法,重写的时候注意避免进入死循环,这些方法是内置方法,__dict__看不到

这些方法不重写的时候都会继承之前的方法,getattr是找不到的时候触发,delattr是删除时候触发,setattr是设置的时候触发

__setattr__这个方法会在实例化的时候执行,所以重写的时候要注意赋值,因为他操作的属性字典。

setattr 这个可以在改写输入属性,比如 要求所有输入的都要求改成字符串 就可以用他来改写

要注意setattr  delattr 这两个如果调用 set self.name=name 会递归调用死机

二次加工标准类型(包装)

可以利用继承和派生的方式重新改写标准函数来实现具体的要求

重写父类内容

super().append()调用父类的方法

授权是包装的另一个特性,就是子类的新功能由自己新写的功能完成,其他授权给已经授权的对象的默认属性来完成相应功能

授权是用getattr来实现的

定义的时候,最后用getattr来调用默认的属性来返回结果,叫授权。因为getattr在调用的时候没有会执行,有的时候会执行就是__getattr__里面嵌套一个getattr方法,就是做了一个中转站,是重写的一种高级写法。如果能找到方法,则触发不了getattr

类似的一种权限管理,比如重写 write的方法 限制敏感词,不让什么词都可以写进去

 

 

 

 

 

  

  

posted on 2019-07-15 17:54  大有哥  阅读(127)  评论(0)    收藏  举报

导航