自省/反射
Posted yulinjun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自省/反射相关的知识,希望对你有一定的参考价值。
什么是自省/反射?
自省也叫反射,主要是指程序可以访问,检测和修改它本身状态或行为的一种能力.
为什么要使用反射?
使用反射类似于使用接口,也就是说当你使用的属性或方法不存在,或者方法还没有实现的时候,使用反射的机制去调用,并不会影响你后继的逻辑的执行,你可以在完成全部逻辑之后再回过头来实现你未实现的方法.反射在多人协作开发项目中可以发挥不小的作用.
反射的实现
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中,这四个函数为内置函数,所以在使用的时候不需要导入任何模块,直接使用就行.
以上是关于自省/反射的主要内容,如果未能解决你的问题,请参考以下文章