如何动态加载Python类

如何动态加载Python类

一个 是一组项目。它是一个具有一些独特属性和方法的逻辑实体。例如,如果你有一个关于板球的类,它应该有像球员、比赛、抛硬币、得分、击球、比赛等属性和方法。使用关键字’class’来创建一个类。

示例:下面是一个简单的类示例-

创建名为’Python’的类,并给它一个属性’a’。

class Python: 
a = 36

本文演示了以下不同的方法来动态加载一个Python类。

使用getattr()函数

对象的getattr()方法返回其命名属性的值。如果没有检测到任何内容,则返回函数的默认值。

示例

要加载名为module_name的模块,请执行命令Call_import_(module_name)。要从模块中加载名为method_name的方法,请调用get_attr(module, method_name)。

# importing the module numpy
numpy = __import__("numpy")
# importing an array from 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”或“magic”方法是那些以两个下划线为前缀和后缀的方法。这里,“Dunder”一词指的是“Double Under(双下划线)”。通常用于处理运算符重载。magic方法的示例包括“__init__”,“__add__”,“__len__”和“__repr__”等。

使用“magic”方法__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):
      # The Constructor
      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类的实例。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程