如何动态加载Python类?

如何动态加载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类实例。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程