如何动态加载Python类?
一个 类(class) 是一组项。它是一个具有几个独特属性和方法的逻辑实体。例如,如果您有一个代表板球的类,则应该具有像球员(players)、锦标赛(tournaments)、翻转(toss)、得分(runs)、击球(wickets)、比赛(matches)等属性和方法。使用关键字”class”来创建一个类。
示例:以下是一个类的简单示例-
创建名为”Python”的类并给它属性”a”-
class Python:
a = 36
本文演示了以下不同的方法来动态加载Python类。
阅读更多:Python 教程
使用getattr()函数
一个对象的 getattr() 方法的命名属性返回其值。如果没有检测到,则返回函数的默认值。
示例
要加载名为module_name的模块,请执行命令Call_import_(module_name)。通过调用get_attr(module, method_name)从模块中加载名为method_name的方法。
#导入numpy模块
numpy = __import__("numpy")
#从numpy导入一个数组
array = getattr(numpy, "array")
the_array = array([[34, 28], [38, 37]])
print(the_array)
输出
以下是以上代码的输出-
[[34 28]
[38 37]]
示例
目前没有一个接受全限定类名并返回类的函数可用。但我们可以开发一个执行此功能的函数。以下示例定义了此类函数-
def my_class(x):
groups = x.split('.')
module = ".".join(groups[:-1])
a = __import__( module )
for comp in groups[1:]:
a = getattr(b, comp)
return a
该函数使用示例为-
import datetime
def my_class(x):
groups = x.split('.')
module = ".".join(groups[:-1])
b = __import__( module )
for comp in groups[1:]:
b = getattr(b, comp)
return b
print (my_class('datetime.datetime').now())
输出
以下是以上代码的输出-
2022-11-16 06:53:13.513141
使用import()方法
Python的“双下划线”或“魔术”方法是以双下划线作为方法前缀和后缀的方法。这里,“Dunder”代表“Double Under (Underscores)”。它们经常用来处理操作符重载。魔法方法的示例有“init”、“add”、“len”和“repr”等。
使用“魔法”方法import是完成这种任务的最简单方法。实际上,如果你在Google上搜索这个问题,这可能是你第一个想到的方法。基本的做法如下 −
module = __import__(module_name)
given_class = getattr(module, Class_Name)
instance = given_class()
在上面的代码中,class_name和module_name都必须是字符串。如果导入的类需要提供任何参数,必须包括这个逻辑。
例子
为了更好地理解它是如何工作的,这里有一个更详细的说明 −
class DynamicImporter:
def __init__(self, module_name, class_name):
# 构造函数
module = __import__(module_name)
the_class = getattr(module, class_name)
instance = the_class()
print (instance)
if __name__ == "__main__":
DynamicImporter("decimal", "Context")
输出
以下是上述代码的输出 −
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
这表明代码按预期操作,因为它导入了decimal并返回一个Context类实例。