反射和自省

一、反射使用

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")

posted @ 2017-04-24 18:38  Great_kyle  阅读(423)  评论(0编辑  收藏  举报