关于反射, 其实一共有 4 个函数:
其中 obj 可以是模块或者是对象
hasattr(obj, str) 判断 obj 中是否包含 str 成员
getattr(obj,str) 从 obj 中获取 str 成员
setattr(obj, str, value) 把 obj 中的 str 成员设置成 value. 注意. 这里的 value 可以是值, 也可以是函数或者方法
delattr(obj, str) 把 obj 中的 str 成员删除掉
注意, 以上操作都是在内存中进行的. 并不会影响你的源代码
在操作的对象是模块的时候:
- import gg #
- # #
- def dd():
- print('这就是我想改的')
- setattr(gg,'g4',dd)# 将原来的函数修改为自动以的函数 dd 》》类似于修改字典中的 vaule
- print(gg.g4())# 调用的时候还是使用原来的方式进行调用
- setattr(gg,'name','我的天啊')# 同理这是对模块中的变量的修改
- print(gg.name)
- delattr(gg,'name') #同理这是对模块中的变量的删除
- print(gg.name)
- # 都不影响源码, 都是修改内存上的内容,
在对象中应用的时候用法基本相同, 注意的是 创建的对象的属性都会存放在创建对象的开辟的内存位置, 所有的方法会放在类的代码区, 使用反射的时候对应进行使用就可以
- class Car:
- def __init__(self,color):
- self.color = color
- def fly(self):
- print('我的车真的会飞')
- gg = Car('黄色')
- if hasattr(gg,'color'):# 通过 hasattr 判断熟悉你是否存在
- print(getattr(gg,'color')) #通过 getattr 获取属性的值
- if not hasattr(Car,'run'):# 当不存在某个方法的时候, 可以通过 setattr 去新建 (setattr: 存在就是修改, 不存在就自动新建)
- setattr(Car,'run',lambda self,x:print('我的车还会跑 %s'%x))
- gg.run('啊')
- if hasattr(Car,'fly'):
- delattr(Car,'fly')
- if not hasattr(Car,'fly'):
- print('fly 方法已经成功删除')
来源: http://www.bubuko.com/infodetail-2840472.html