一、反射使用
python是面向对象语言,其中反射的含义为:通过字符串的形式操作对相关的属性。
python内置四个自省的方法:
1、hasattr(object,name)
2、getattr(object,name,default=None)
3、setattr(object,key,value)
4、delattr(object,item)
注意:这里的key、name、item 都是字符串
定义一个Shool类:
class Shool:
def __init__(self,name,addr):
self.name =name
self.addr =addr
def room(self):
print("这里有很多300间教室")
hasattr举例
s1 = Shool("中学","天通苑")#实例化
print(hasattr(s1,"room"))#判断s1是否有room属性
print(hasattr(s1,"name"))#判断s1是否有name属性
print(hasattr(s1,"addr"))#判断s1是否有addr属性
print(hasattr(s1,"addrname"))#判断s1是否有addrname属性
执行结果
True
True
True
False
getattr举例
res1 = getattr(s1,"name")
res2 = getattr(s1,"addr")
res3 = getattr(s1,"room")
res4 = getattr(s1,"addroom", "没有这个属性")
print(res1)
print(res2)
print(res3)
print(res4)
执行结果
中学
天通苑
<bound method Shool.room of <__main__.Shool object at 0x105d710f0>>
没有这个属性
setattr举例
print(s1.name)
setattr(s1,"name","大学") # 修改了s1.name
print(s1.name)
setattr(s1,"square",23000) #没有square,就新建一个square属性
print(s1.square)
执行结果
中学
大学
23000
delattr举例
res1 = getattr(s1,"square")
delattr(s1,"square")
res2 = getattr(s1,"square","这个属性没有了")
print(res1)
print(res2)
执行结果
23000
这个属性没有了
对象可以使用这四个方法外,类也可以使用这些方法。同上
补充:模块也可以通过反射,查看是否存在某个方法。
import sys
this_module = sys.modules[__name__] # 获取当前的模块名
二、作用和好处
1、实现可插拔机制:相互依赖的两个py执行文件,可以通过这个方式协同工作
2、动态导入模块:
import importlib
importlib.import_module("import_lib.metaclass")