什么是反射
反射主要是指程序可以访问、检测和修改它本身状态活性位的一种能力(自省)
四个可以实现自省的函数
hasattr(对象,字符串)
–》检测对象的字符串存在不存在
getattr(对象,字符串,如果找不到给返回这个值)
–》获取字符串的值,不存在报错
setattr(obj,key,value)
–》字符串的key = value
delatt(obj,字符串)
–》删除obj.字符串
·===============================·
hasattr
用来检测object中有没有一个name字符串对应的方法或属性
class Heizhongjie:
feturn ='Ugly'
def __init__(self,name,addr):
self.name = name
self.addr = addr
def sell_hourse(self):
print('%s正在卖房子'%self.name)
def rent_hourse(self):
print('%s租房子'%self.name)
b1 = Heizhongjie('伊博乐地产','孙河')
print(hasattr(b1,'name'))
print(hasattr(b1,'sell_hourse'))
hasattr查的是b1.能不能调用得到name
和sell_hourse
这两个属性,能就返回True
print(getattr(b1,'name'))
print(getattr(b1,'rent_hourse'))
如果没有,就会报错
getattr(b1,'rent_hourse')
因为他返回的是一个地址,把他赋值,然后加括号运行就可以运行该函数了
setattr(b1,'sb',123)
setattr(b1,'name','韩文文地产')
print(b1.__dict__)
setattr相当于增加
delattr(b1.'sb')
把b1中的sb删掉,相当于del b1.sb
=========================================
在编码时如果接收到的模块是一个字符串形式的模块,那么这个时候就可以使用importlib
这个模块方法,例如,我在m1下创建了一个叫test的python文件,文件中写有两个函数,之后要用importlib
的方法使用test的函数:
m1下test的内容:
def test():
print('test1')
def _test2():
print('test2')
调用模块的内容:
import importlib
m = importlib.import_module('m2.test')
print(m)
m.test()
m._test2()
这个方法和from m2 import test类似,但是适用于接收的参数为字符串时的调用