反射
导入模块常见的几种形式
1 def f1(): 2 print("F1") 3 4 def f2(): 5 print("F2")
1 import test1 2 test1.f1() 3 4 from test1 import f1 5 f1() 6 7 from test1 import f1 as new_f1 8 new_f1()
如何用字符串来导入模块呢,这里我们需要内置函数__import__
#根据字符串导入模块
c = __import__("test1")
c.f1()
#如果要导入from foo import base该如何操作呢?
b = __import__('foo.base')
print(b)
结果:
<module 'foo' from 'D:\\python_work\\elective_system\\foo\\__init__.py'>
#发现只导入到foo这里,这里我们需要加个fromlist参数
b = __import__('foo.base',fromlist=True)
print(b)
结果:
<module 'foo.base' from 'D:\\python_work\\elective_system\\foo\\base.py'>
此时就是我们想要结果了
不过官方建议用b = importlib.import_module("lib.base"),需先导入importlib模块。这句等同于__import__('foo.base',fromlist=True)
那么如何根据字符串在模块中寻找方法或则属性(这个是类的叫法,或则这里你可以叫全局变量和函数)呢?这里需要用到内置函数getattr
c = __import__("test1") #根据字符串导入模块
func = getattr(c,'f3') #根据字符串在模块中寻找函数
func() #执行函数
#getattr还有第三个参数
c = __import__("test1")
getattr(c,"f3")
#如果模块中没有f3方法或则属性,则会报错
c = __import__("test1")
func = getattr(c,"f3",None)#加一个参数None
print(func)
结果:
None
如何判断一个属性或则方法是否存在?使用内置函数hasattr
c = __import__("test1")
print(hasattr(c,"f3"))
print(hasattr(c,"f1"))
结果:
False
True
应该还有设置属性或则方法,使用内置函数setattr
c = __import__("test1")
print(hasattr(c,"f3"))
setattr(c,"f3","F3")
print(hasattr(c,"f3"))
结果:
False
True
删除属性或则方法,使用内置函数delattr
c = __import__("test1")
print(hasattr(c,"f1"))
delattr(c,"f1")
print(hasattr(c,"f1"))
结果:
True
False
上面这些就是反射的用法,反射的定义就是通过字符串映射或修改程序运行时的状态、属性、方法
在类中的使用
def sleep(self):
print("%s is sleeping"%self.name)
class Role(object):
def __init__(self,name):
self.name = name
def eat(self):
print("%s is eating..."%self.name)
def run(self):
print("%s is runing..."%self.name)
d = Role("lxj") #实例化
choice = input(">>").strip() #输入方法
if hasattr(d,choice): #判断属性或则方法是否存在
func = getattr(d,choice) #获得属性或则方法,属性直接返回值,方法返回是内存地址
if callable(func): #判断是否可调用
func() #方法调用
else:
print(func)
else:
# setattr(d,choice,sleep) #设置一个方法
# d.sleep(d)
setattr(d,choice,27) #设置一个属性
print(getattr(d,choice))

浙公网安备 33010602011771号