如何在类内部最佳导入模块?

2024-06-26 12:42:28 发布

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

我有一个Python模块文件,它实际上是一个具有相关联的公共和私有函数的类。我想在类和所有函数中使用日志模块。但问题是如果我只在__init__()内导入一次,则在其余的功能。Do我必须在类的每个函数中导入它?在

在类中导入此类模块的最佳方法是什么。我在stackoveflow论坛上搜索了关于这个问题的各种讨论,但没有找到具体的东西。在

下面是我的示例类:

class Add:
    def __init__(self,no1,no2):
        import logging
        logging.basicConfig(filename='example2.log',level=logging.INFO)
        logging.info("The two parameters passed are {0} and {1}:".format(no1,no2))
        self.num1 = no1
        self.num2 = no2

    def add(self):
        logging.debug("Inside add function of Add class")
        logging.info("Adding the two class properties")
        self.result = self.num1 + self.num2
        logging.debug("Exiting add function")

    def display(self):
        logging.debug("Inside display class")
        return self.result

if __name__ == '__main__':
    a = Add(10,11)
    a.add()
    print (a.display)

当我试着运行这个程序时:

^{pr2}$

Tags: 模块函数debugselfinfoaddinitlogging
2条回答

您可以简单地将其分配给一个变量:

class Foo:
    def __init__(self):
        import logging
        self._logging = logging

但我建议只在模块级别导入它。将模块附加到类的成员变量上感觉非常错误。在

另一个选择是只存储要使用的记录器:

^{pr2}$

PS:这可能不是为类创建记录器的正确方法,我从来没有这样做过,只是在这里即兴创作的。仔细阅读如何做这件事。

所以这里的问题是范围问题。在函数内部导入时(有时有时,请参见下文),则该导入的范围仅限于该函数内部:

def foo():
    import a
    a.something()

def bar():
    a.something() # won't work

相反,您应该尝试始终在顶部导入:

^{pr2}$

你还应该想出一个好的,可维护的方法来订购你的进口产品。在

现在,你可以在一个函数内部完成它,你可以做一些有趣的事情,比如动态导入和反射,以及各种很酷的事情,但是99.9%的时间你不需要,所以增加这种复杂性会降低可维护性(这应该是你的目标)。在

最好的时机是解决复杂的循环导入,或者如果您正尝试使用动态加载来提高性能。但是当谈到优化性能时,你应该总是先构建它,然后再看看它哪里出了问题。在

相关问题 更多 >