如何将子模块中的类/函数相互导入?

马特·皮特金

假设我有一个 python 模块,如下所示:

setup.py
tpkg/
    __init__.py
    module1.py
    module2.py

在哪里__init__.py

from .module1 import class1
from .module2 import class2

module1.py 是:

from .module2 import class2

class class1(object):
    def __init__(self):
        self._who = "Class 1"

    def __str__(self):
        return "I'm {}".format(self._who)

    def otherclass(self):
        print(str(class2()))

module2.py 是:

from .module1 import class1

class class2(object):
    def __init__(self):
        self._who = "Class 2"

    def __str__(self):
        return "I'm {}".format(self._who)

    def otherclass(self):
        print(str(class1()))

并且setup.py是:

from setuptools import setup

setup(name="tpkg",
      version="0.0.1",
      packages=["tpkg"])

所以,这里两个模块都需要导入包含在另一个模块中的类。

如果我安装此模块并尝试import tpkg我收到错误

In [1]: import tpkg
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-834a70240c6c> in <module>()
----> 1 import tpkg

build/bdist.linux-x86_64/egg/tpkg/__init__.py in <module>()

build/bdist.linux-x86_64/egg/tpkg/module1.py in <module>()

build/bdist.linux-x86_64/egg/tpkg/module2.py in <module>()

ImportError: cannot import name class1

所以,我的问题是,我应该如何将两个模块中的类相互导入?

更新这个问题与这里给出的略有不同,它询问为什么循环导入会出现问题,而不是如何解决循环导入问题的问题,这正是我所需要的。

吉吉琼斯

您通常应该尽量避免循环依赖:

http://stackabuse.com/python-circular-imports/

否则你可以尝试本地导入

class class1(object):
def __init__(self):
    self._who = "Class 1"

def __str__(self):
    return "I'm {}".format(self._who)

def otherclass(self):
    from test2 import class2

    print(str(class2()))

test = class1()

test.otherclass()

class class2(object):
def __init__(self):
    self._who = "Class 2"

def __str__(self):
    return "I'm {}".format(self._who)

def otherclass(self):
    from test1 import class1
    print(str(class1()))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用__import__函数从子模块导入名称?

如何将更改恢复到git子模块?

如何将Git子模块指针还原为存储在包含存储库中的提交?

如何将PHPMailer导入使用名称空间的类中?

如何导入模块隐藏子模块或实例?

如何在Python中单独导入子模块?

Python:如何将没有python文件名的模块作为子模块导入?

如何在Python中从C#dll导入子模块

Angular-如何将模块导入子模块?

如何将git子模块导入NetBeans 8.1?

如何将子目录添加为git中的子模块

如何将父模块中的模块导出到子模块

如何将组件导入Angular中的Service类

如何将修改后的子模块“ git添加”到主模块中?

如何将PyTorch子模块保持在评估模式?

如何将swift类导入到ViewController中?

如何将模块导入jsx?

如何将其他模块中的类导入 Jersey?

如何将构造函数参数传递给 ECMAScript 6 中的导入类?

如何将子模块导入父命名空间?

如何将模块导入xcode

如何导入 webpack 子模块?

如何将 TypeScript 类集中导入 Angular 模块?

如何将传入流量重定向到模块到 Omnet++ 中的简单子模块?

从 __init__.py 中的子模块导入函数而不暴露子模块

在基类的构造函数中从同一子模块导入其他子类

如何将项目导入模块?

当框架有外部依赖时,如何将 iOS 框架作为 git 子模块导入

如何将结构的实现移动到单独的文件中而不将其放入子模块中?