【问题标题】:Import with Two Files and both need the import使用两个文件导入并且都需要导入
【发布时间】:2018-09-22 13:45:31
【问题描述】:

我有两个 py 文件并将我的问题简化为几行。

一个:

from Two import PrintTwo

class PrintOne(object):
    print('HelloOne')

两个:

from One import PrintOne

class PrintTwo(object):

    print('HelloTwo')

这会显示此消息:无法按预期导入名称“PrintTwo”。

但我的问题是我需要在两个文件中使用这些类的一些功能。

我找不到解决方案,对于这种情况,正确的工作流程如何?

亲切的问候

【问题讨论】:

  • 您正在创建循环导入。为了像这样混合和匹配这些类需要一起声明,我不相信还有任何其他“正确”的解决方案
  • 一起声明意味着在一个文件中?
  • 是的,取决于您打算如何使用每个文件中的方法,还有其他解决方法,但它们不是好的做法,例如在文件开头导入而不是在文件开头导入需要它(在导入时未执行的内部函数或类函数),但这不允许您执行子类化等操作
  • 谢谢!拥有第三个文件是否是一个好的解决方案,让我们称之为“传输”,我处理通过文件交换的所有数据?
  • 添加第三个文件并不能真正解决任何问题,因为您在每个文件中仍然有单独的命名空间,您唯一的解决方案是将两个类放入一个文件中,或者作为多米尼克的答案,您使用惰性导入,但如前所述,这意味着您不能将这些导入的类用于子类。

标签: python python-3.x class import


【解决方案1】:

这称为循环导入,如果您正确设置它们,它们就可以工作。但是,我不建议使用循环导入,而是重构代码。

如果我没有看到,很难说要对代码进行哪些更改。当我遇到循环导入时,我会尝试通过重构代码来避免它们。可能的解决方案是:

  • 将部分“共享”代码移动到自己的 Python 模块中(推荐)
  • 延迟导入模块/组件,意味着仅在使用时才导入(有效但不是很闪亮)

我无法根据上面的代码向您展示示例,因为您只是循环导入模块但不使用它们。

如前所述,一种解决方法是仅在使用导入时才使用它们,例如:

class PrintOne:

    def some_magic_method(self):
        from Two import PrintTwo

【讨论】:

  • 你帮了我很多!我很不确定是否会推荐制作第三个 python 文件,或者只是让我的问题变得更大。现在,考虑到解决方案,我可以继续前进。尤其是寻找正确的东西!
  • 不客气。在这种情况下创建第三个 python 文件是可以的,很可能是推荐的(没有看到代码):)
猜你喜欢
  • 2017-10-27
  • 2013-08-10
  • 2022-01-02
  • 2023-04-01
  • 1970-01-01
  • 2015-11-05
  • 2014-01-16
  • 2017-03-18
相关资源
最近更新 更多