python动态加载技术解析.docx
第
python动态加载技术解析
目录前言反射技术模块动态加载importlibcallback方式(回调)
前言
提到python动态加载技术,我们需要聊上几个话题:
1)反射技术
2)模块动态加载importlib
3)callback(函数名传递)--不完全算是吧动态
反射技术
先说反射技术,所谓反射技术就是指的是在程序的运行状态中,对于任意一个类,都可以知道这个类的所有属性和方法;对于任意一个对象,都能够调用他的任意方法和属性,增加删除方法和属性。这种动态获取程序信息以及动态调用对象的功能称为反射机制。
步骤:
classAnimal:
def__init__(self,name,legs)-None:
self.name=name
self.legs=legs
defget_legs(self):
returnself.legs
defget_name(self):
returnself.name
animal=Animal(dog,4)
print(dir(animal))
[__class__,__delattr__,__dict__,__dir__,__doc__,__eq__,__format__,__ge__,__getattribute__,__gt__,__hash__,__init__,__init_subclass__,__le__,__lt__,__module__,__ne__,__new__,__reduce__,__reduce_ex__,__repr__,__setattr__,__sizeof__,__str__,__subclasshook__,__weakref__,get_legs,get_name,legs,name]
具体一个应用场景,比如我们的testcase来自一个文本的创建的一个测试计划,其中是一个所要执行的测试用例的list
[test_test1,test_test2,...]
我们要执行它,比如我的测试实例是test_obj
classT1:
deftest_test11(self):
print(test11)
deftest_test22(self):
print(test22)
classTest(T1):
deftest_test1(self):
print(test1)
deftest_test2(self):
print(test2)
test_obj=Test()
fortestin[test_test1,test_test2,test_test11,test_test22]:
method=getattr(test_obj,test)#如果该函数不存在会raiseexception
method()
#可以修改如下
test_obj=Test()
fortestin[test_test1,test_test2,test_test11,test_test22]:
method=getattr(test_obj,test,lambda:donothing)#如果不存在就运行一个匿名函数,实际就是一个默认值
method()
反射中的setattr等不在本次讨论的范畴。
模块动态加载importlib
动态加载模块,可以用于,当我们已经知道我们的模块名称,在我们的目的是动态加载这些module用于运行;动态加载指在程序运行中,动态的加载模块,而不是在运行之前利用import或from...import的方式加载模块的方式。
应用场景:
(1)程序在运行期间才能确定加载的模块。
(2)在某种条件下,需要通过模块名字符串进行加载的模块。
#mymodule/mytest.py
defhelloworld():
print(helloworld)
classMyModule:
defprint_hello(self):
print(fhellofrom{self.__class__})
#test.py
importimportlib
defimport_method1():
Frommodule
module=importlib.import_module(mymodule.my