反射的概念
反射主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,又称为自省。python面向对象中的反射
通过字符串的形式操作对象相关的属性,因为python中一切事物都是对象,所以都可以使用反射。
从代码来看
calss A:
role = "abc"
def func(self):
print("*"*self)
print(hasattr(A,"role")) # hasattr方法,判断role属性是否在A的命名空间里
print(getattr(A,"role")) # getattr方法,从A的命名空间里找一个属性,直接就可以找到这个属性
print(setattr(A,"func)) # 判断func是否在A的命名空间
print(getattr(A,"func")) # 从A的命名空间里找到这个方法,找到的是这个方法的内存地址
# 如果是方法,找到的是方法的内存地址,需要加上()就可以执行这个函数反射的四个内置函数
- hasattr() ------> 判断一个命名空间里是有没有这个名字,返回值是boolean类型,只有True和False
- getattr(参数1,参数2,参数3) ------> 从命名空间中获取这个名字对应的值,属性直接得到值,方法的到的是内存地址,如果值不存在,就会报错,参数3是可选的,如果值不存在就返回参数3,没有的话,报错
- setattr() ------> 增加值,改值
- delattr() ------> 删除值
- ps:
- 参数1:类-使用类命名空间的名字,或者是对象的名字,或者是模块的名字,
- 参数2:类中的属性,对象-使用对象能用的方法和属性,或者是模块的方法和属性
- getattr() 和 hasattr()一定要配合使用
模块举例:
import time
time.time() # 1
print(getattr(time,"time")) # 2
# 1 和 2 的结果是一样的反射在代码中的概念
正常情况下,如果可以拿到这个变量,那么如果有这个变量的字符串形式,就可以用反射获取到这个值,使用字符串数据类型的变量名来访问一个命名空间中的名字。一句话概括:类可以获取类中的属性和方法。
- 找一个属性,直接就可以找到这个属性的值
- 找一个方法,找到的是这个方法的内存地址