文档详情

python动态加载技术解析.docx

发布:2025-05-13约5.49千字共9页下载文档
文本预览下载声明

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

显示全部
相似文档