自省/反射

什么是自省/反射?

  自省也叫反射,主要是指程序可以访问,检测和修改它本身状态或行为的一种能力.

为什么要使用反射?

  使用反射类似于使用接口,也就是说当你使用的属性或方法不存在,或者方法还没有实现的时候,使用反射的机制去调用,并不会影响你后继的逻辑的执行,你可以在完成全部逻辑之后再回过头来实现你未实现的方法.反射在多人协作开发项目中可以发挥不小的作用.

反射的实现

  python中实现反射的方式非常简单,只需调用几个函数即可.反射里面包含有四个函数,分别是getattr(),setattr(),hasattr()和delattr(),这四个函数的具体用法如下:

  1.getattr(obj, attr_name, [default])

    obj:要检测的类或对象

    attr_name:要检测对象的属性名字的字符串

    default:可选,检测的属性不存在时返回的值

    使用该函数时,如果要检测的属性不存在,将会报错,但指定了default就不会报错,并且返回的值就是指定的default.

 1 class Bar:
 2     
 3     name = "bar"
 4 
 5     def test(self):
 6         print("test")
 7 
 8 print(getattr(Bar, "name"))
 9 print(getattr(Bar, "age"))  # 报错,因为没有该属性
10 print(getattr(Bar, "age", "没有该属性"))     # 这里没有报错,因为它指定了默认值,当找不到属性时,就会返回默认值

  2.hasattr(obj, attr_name)

    该函数可以检测存在或不存在的属性,当属性不存在时也不会报错.

1 class Bar:
2     
3     name = "bar"
4 
5     def test(self):
6         print("test")
7 
8 print(hasattr(Bar, "test"))     # True
9 print(hasattr(Bar, "age"))      # False

  3.setattr(obj, attr_name, value)

    value:要设置的属性的值

    当设置的属性存在时,原来的属性值将被value覆盖;当设置的属性不存在时,将生成新的属性,属性值为value.注意,属性也可以是函数属性.

 1 class Bar:
 2     
 3     name = "bar"
 4 
 5     def test(self):
 6         print("test")
 7 
 8 setattr(Bar, "name", "Bar")
 9 print(Bar.name)     # Bar
10 setattr(Bar, "style", "simple")   # 属性不存在,将生成新的属性
11 print(Bar.style)    # simple
12 setattr(Bar, "func", lambda self: self + 1)   # 函数属性不存在,将生成新的函数属性
13 print(Bar.func(10))   # 11

  4.delattr(obj, attr_name)

    当删除的属性不存在时会报错.  

1 class Bar:
2     
3     name = "bar"
4 
5     def test(self):
6         print("test")
7 
8 delattr(Bar, "name")
9 delattr(Bar, "age")     # 报错,因为要删除的属性不存在

在python中,这四个函数为内置函数,所以在使用的时候不需要导入任何模块,直接使用就行.

猜你喜欢

转载自www.cnblogs.com/yulinjun/p/13200482.html