通过使用变量引用来导入 class?

Importing a class by referring to it with a variable?

编辑:这个问题假设我可以导入部分模块而不导入整个模块。事实证明情况并非如此,所以我决定只使用 from ex45_extras import * 导入整个模块。这让这个问题变得毫无意义,但我决定不删除这个问题,这样其他一些有同样问题的初学者可以来到这里并找出一个可悲的事实:无论如何你不能将模块作为部件导入

以下为原题:

我是初学者,对菜鸟问题很抱歉。我想从带有变量的模块中调用特定的 classes。我不想调用整个模块。我需要使用此 class Nav() 来控制要导入的 classes。有没有办法做到这一点?或者有更好的解决方案吗?

class Nav():
    def __init__(self):
        print("This is class Nav")
    
    def play(self):
        current_scene_name = "A()" # this is where the variable is defined
        from ex45_extras import current_scene_name # <- this is the one


x = Nav()
x.play()

目前正在引发此错误:

This is class Nav
Traceback (most recent call last):
  File "D:\Programming\Python\LPTHW_Exs\ex45\test.py", line 11, in <module>
    x.play()
  File "D:\Programming\Python\LPTHW_Exs\ex45\test.py", line 7, in play
    from ex45_extras import current_scene_name
ImportError: cannot import name 'current_scene_name' from 'ex45_extras' (D:\Programming\Python\LPTHW_Exs\ex45\ex45_extras.py)

猜想是因为您要导入字符串 "A()" 而不是 class A()

Class 名称没有尾随 () 后缀 — 这就是您创建一个实例的方式(即通过调用它)。

无论如何,如果 ex45_extras.py 定义了一个名为 A 的 class:

class A:
    pass

然后您可以通过包含其名称的字符串 import class,然后创建它的实例,如下所示:

class Nav():
    def __init__(self):
        print("This is class Nav")

    def play(self):
        import ex45_extras

        current_scene_name = 'A' # this is where the variable is defined
        class_ = getattr(ex45_extras, current_scene_name)  # Get class.
        instance = class_()  # Create instance of class.
        print(f'{instance=}')  # -> instance=<ex45_extras.A object at 0x010D4838>


x = Nav()
x.play()