与 Python 的导入包内引用混淆



我运行Python 2.7.6。我有一个问题,创建一个包。以下是MWE:

我有以下文件:

run.py
    MyPackage/
        __init__.py
        Father_class.py
        Son_class.py
        class1.py

包含以下内容:

init . py

__all__ = ['Father_class', 'Son_class', 'class1']

run.py

from MyPackage import Father_class, Son_class

Father_class.py:

class Daddy(Object):
    def __init__(self):
        self.hello=1

Son_class.py:

from MyPackage import *
# alternatively I tried: from MyPackage import class1, Father_class
class Sonny(Daddy):
    def __init__(self):
        super(Daddy, self).__init__()
        self.bye=class1.MyClass1()
        #alternatively I tried self.bye=MyClass1()

class1.py:

class MyClass1(Object):
    def __init__(self):
        self.life=1

运行run.py得到:

    self.bye=class1.MyClass1()
NameError: global name 'class1' is not defined

你知道我做错了什么吗?

的答案可能是最好的方法,因为它避免了混乱的import *

仅供参考,Son_class.py中的from MyPackage import *可能不像您期望的那样工作的原因是,您只能从__init__.py中定义的MyPackage对象导入

如果你把__init__.py改成

import Father_class
import Son_class
import class1

你的例子应该正常工作。

作为题外话,约定指出python模块名是小写的。

您只能导入相对于您导入的位置的模块,除非您导入的模块在site-packages全局或虚拟环境中可用。因此,Package/a中的a模块不能通过导入package并从那里导航来导入package/b中的b模块,但它可以直接导入b(处于同一级别):

对于Son_class.py使用

from class1 import MyClass1
from Father_class import Daddy
class Sonny(Daddy):
    def __init__(self):
        super(Daddy, self).__init__()
        self.bye=MyClass1()

否则,建议在导入中指定并导入所需的定义:这将在需要重构任何东西时提供巨大的帮助。如果您显式地写下导入路径,您还会收到一个更合理的错误消息。

相关内容

  • 没有找到相关文章