Python是一门动态语言,动态是指运行代码时才对变量进行数据类型检测,无须事先指定数据类型;而反射机制则是动态语言的重要特点!
一、反射机制
1.1、什么是反射?
在程序运行状态中,可以动态获取与调用任意类、对象的所有属性信息以及调用方法,这种动态获取程序信息与调用对象的功能称为反射机制!即当接收到一个类或对象时,我们事先不知道它包含有什么属性、方法,但我们可以临时去获取、操作它们!像神经反射,你敲我腿部关节,我神经反射自动地反应出相应动作来!
1.2、为何用反射?
据上所述,东西来了之后再有反应,那么我们可以事先定义好接口的逻辑,后期再去实现具体功能!
1.3、如何用反射?
Python为我们提供了4个内置函数,我们可以通过字符串来操作属性值很方便地实现了反射机制!
1.3.1、hasattr
判断对象有无指定属性
>>> class Chinese:
... def __init__(self, name):
... self.name = name
>>> gd = Chinese('sanxi')
>>> hasattr(gd, 'age') # 判断对象gd有无属性age
False
1.3.2、getattr
获取对象的指定属性所对应的值,无则返回None;如不指定None且属性不存在时则报错!
>>> getattr(gd, 'name', None)
'sanxi'
1.3.3、setattr
设置对象指定属性的值,属性存在则修改,否则创建新值!
>>> setattr(gd, 'age', 18)
>>> getattr(gd, 'age')
18
1.3.4、delattr
删除对象指定属性,属性不存在则报错!
>>> delattr(gd, 'age')
>>> hasattr(gd, 'age')
False
二、class内置方法
2.1、何为内置方法
Python的class机制给我们内置很多方法,即类内以双下划线开头与结尾的方法,它们会在满足条件时自动触发执行!
2.2、为何用内置方法
为了更加定制化我们的类或者对象
2.3、如何用内置方法
以两个常见的方法为例:
2.3.1、str
print函数打印的就是此方法的返回值!它在打印对象时会自动触发,然后将返回值传递给print!此方法必须返回string!
>>> class Chinese:
... def __init__(self, name):
... self.name = name
... def __str__(self):
... return f'{self.name}'
...
>>> gd = Chinese('sanxi')
>>> print(gd)
sanxi
2.3.2、del
del方法在清理对象时触发!因为某些场景下,一个对象可能维持为文件打开状态与网络连接状态,当Python代码执行完毕后回收名称空间时时无法回收系统资源的,这时候就需要定制del方法用于在清除对象时触发系统资源回收操作!
>>> class MySQL:
... def __init__(self,ip,port):
... self.conn=connect(ip,port) # 假设存在网络连接,这种连接占用系统资源!
... def __del__(self):
... self.conn.close() # 关闭网络连接,回收系统资源!
...
>>> obj=MySQL('127.0.0.1',3306)
>>> del gd # 在对象gd被删除时,自动触发gd.__del__()