反射和自省

一、反射使用

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

转载于:https://www.cnblogs.com/greatkyle/p/6758318.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值