概念
运行时: 区别于编译时,指程序被加载到内存中执行的时候.
反射(自省): 指运行时获取对象的类型信息.
具有反射能力的函数:type(), isinstance(), getattr()等.
作用: 通过字符串映射或修改程序(内存)运行时的状态、属性、方法.
注意:对实例动态添加属性时(setattr方法),注意该添加的方法不会绑定实例(使用时,相当于普通函数调用,参数需要填入).所以应该将方法添加到类对象中,而非该类对象的实例.
语法
a) hasattr(object,name)
判断对象里是否有相应字符串的方法。如read里 输入run方法。
print(hasattr(h, read))
b) getattr(object,name,default=None)
获取字符串里的对象方法内存地址
print(getattr(h, read))# 映射对象的方法所在的内存地址
print(getattr(h, read)())# 加()执行对象方法
c) setattr(obj.name,value)
为对象创建新的方法(或将类之外的方法、属性添加到类中)
obj.name = value
d) delattr(x,y)
删除对象中的方法
例:利用反射使函数解耦
class New(object):
def __init__(self):
pass
def input(self):
while True:
inp = input('>>> ')
cmd = inp.split()[0]
if hasattr(self,cmd):
func = getattr(self,cmd)
func(cmd)
else:
print('{new} is not exist' .format(new=cmd))
continue
def inter(self,*args):
x = args[0]
print(x)
a1 = New()
a1.input()
例:利用反射,执行模块方法
# 编写test2.py文件
def add():
print('add')
def del_1():
print('del')
def fetch():
print('fetch')
# 编写test1.py文件
import test2
list1 = [
{'cap':'add user', 'func':'add'},
{'cap':'del uesr', 'func':'del_1'},
{'cap':'search user', 'func':'fetch'}
]
for index, item in enumerate(list1, 1):
print(index, item['cap'])
def ch():
choice = input('input num above menu: ')
choice = int(choice)
if choice in range(1,4):
func_name = list1[choice-1]['func']
func = getattr(test2, func_name)
func()
else:
print('error! out of range!')
return ch()
if __name__ == '__main__':
ch()