35、反射机制与class内置方法

面向对象 / 2021-01-04

  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__()
世间微尘里 独爱茶酒中