反射:通过字符串的形式导入模块。通过字符串的形式去模块中找到指定函数并执行
#!/usr/bin/env python3
# -*- encoding:utf-8 -*-
i = input('请输入模块名:')
cc = __import__(i) # __import__可以通过输入的字符串来导入模块;等同于import com as cc
print(cc.f1())
#!/usr/bin/env python3
# -*- encoding:utf-8 -*-
# getattr可以在指定模块中以字符串形式找函数名
i = input('请输入模块名:')
cc = __import__(i) # 通过输入的字符串来导入模块
de = input('请输入函数名:')
ff = getattr(cc, de) # 在导入的模块中输入指定的函数名做成新函数对象
print(ff()) # 执行反射过来的函数
ff = getattr(cc, de, None) # 如果模块中不存在输入的函数,可以指定默认值,返回None
ret1 = hasattr(cc, 'f3') # 指定模块中以字符串形式判断某对象是否存在
print(ret1)
setattr(cc, 'ha', 'he') # setattr可以为指定模块在内存中添加一个对象,也可以添加lambda函数对象
ret2 = hasattr(cc, 'ha')
print(ret2)
delattr(cc, 'name') # delattr在内存中删除模块的某个对象
ret1 = hasattr(cc, 'name')
print(ret1)
cc = __import__('lib.test.com', fromlist=True) # 通过fromlist参数可以递归的往目录里找模块
类的反射特点
类,只能找类里的成员
class Foo:
def __init__(self, name):
self.name = name
def show(self):
print('show')
obj = Foo('liujun')
print(hasattr(Foo, 'show')) # True
对象,即可以找对象,也可以找类里面成员
class Foo:
def __init__(self, name):
self.name = name
def show(self):
print('show')
# obj = Foo('liujun')
# print(hasattr(Foo, 'show')) # True
# print(hasattr(Foo, 'name')) # False
obj = Foo('liujun')
print(hasattr(obj, 'name')) # True
print(hasattr(obj, 'show')) # True