python面向对象之反射

386 阅读2分钟

反射的概念

      反射主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,又称为自省。
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 的结果是一样的

反射在代码中的概念

       正常情况下,如果可以拿到这个变量,那么如果有这个变量的字符串形式,就可以用反射获取到这个值,使用字符串数据类型的变量名来访问一个命名空间中的名字。一句话概括:类可以获取类中的属性和方法。

  • 找一个属性,直接就可以找到这个属性的值
  • 找一个方法,找到的是这个方法的内存地址