Python类中的导入模块

2024-06-06 18:14:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在一个类中导入不同的模块:

class TCON_COMMS(object):
    TCON_COMMS_AARDVARK = 0
    TCON_COMMS_GPU = 1
    TCON_COMMS_SMC_I2C = 2
    def __init__(self, TCON_COMMS_METHOD=0):
        self.TCON_COMMS_METHOD = TCON_COMMS_METHOD
        if self.TCON_COMMS_METHOD == self.TCON_COMMS_AARDVARK:
            print("Using Aardvark for TCON communication.")
            from i2c_helper_aardvark import *
        elif self.TCON_COMMS_METHOD == self.TCON_COMMS_GPU:
            print("Using AUX for TCON communication.")
            from i2c_helper_aux import *
        else:
            print("Using SMC for TCON communication.")
            from i2c_helper_smc import *

当我写这篇文章时,我得到:

^{pr2}$

这是什么意思?


Tags: fromimportselfhelperforgpui2cmethod
2条回答

在函数内部,局部变量存储在带编号的槽中,而不是像全局变量那样存储在字典中。这意味着Python编译器在创建函数的code对象之前需要知道函数的所有局部变量的名称,这样它就可以将每个局部变量的访问转换为一个适当的字节码,以便从槽中读写。在

执行from some_module import *操作时,无法提前知道导入的确切名称。它取决于some_module它定义了什么名称(如果它有__all__,则将其放入__all__)。这意味着编译器无法提前看到名称并将每个名称分配给插槽。在顶层导入时,事先不知道名称不是问题,因为每个name/object对只会添加到模块的globals字典中。在

要使代码正常工作,您要么只需要导入模块(并以属性的形式访问模块的内容),要么可以显式地命名要从中导入的项。哪一个最好取决于你的品味(也许还有你需要从模块中取多少个不同的名字)。在

我不知道你到底需要从你的i2c_helper_whatever模块中得到什么,所以我不能给出一个显式列出的名称的例子,但是这里有一个例子,它在一个常规的import上使用一个as子句来给任何被选中的模块提供相同的名称(在本地命名空间中)(我不知道我选择的名称是否正确,自己判断):

def __init__(self, TCON_COMMS_METHOD=0):
    self.TCON_COMMS_METHOD = TCON_COMMS_METHOD
    if self.TCON_COMMS_METHOD == self.TCON_COMMS_AARDVARK:
        print("Using Aardvark for TCON communication.")
        import i2c_helper_aardvark as i2c_helper
    elif self.TCON_COMMS_METHOD == self.TCON_COMMS_GPU:
        print("Using AUX for TCON communication.")
        import i2c_helper_aux as i2c_helper
    else:
        print("Using SMC for TCON communication.")
        import i2c_helper_smc as i2c_helper

    i2c_helper.something() # this will call a function from whichever module was imported

这意味着您不能在类、函数或其他内部使用from module import *。将它们移到文件的顶部。在

相关问题 更多 >