与Python的导入包内引用相混淆

2024-04-30 00:44:58 发布

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

我运行python2.7.6。我在创建包时遇到问题。以下是MWE:

我有以下文件:

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

包括以下内容:

初始化.py

^{pr2}$

在运行.py在

from MyPackage import Father_class, Son_class

父亲_类.py公司名称:

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

儿子_类.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()

1.py类:

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

跑步时运行.py我得到:

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

你知道我做错了什么吗?在


Tags: frompyimportselfinitdef公司class
2条回答

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

仅供参考,Son_class.py中的from MyPackage import *可能无法按预期工作,原因是您只能从__init__.py中定义的MyPackage对象导入

如果您将__init__.py更改为

import Father_class
import Son_class
import class1

你的例子应该按原样运作。在

另外,convention statespython模块名是小写的。在

除非导入的内容在site-packages全局中或在virtualenv中可用,否则只能相对于导入的位置导入模块。因此,Package/a中的模块a无法通过导入package并从中导航来导入b中的模块{},但它可以直接导入{}(处于同一级别):

为了儿子_类.py使用:

from class1 import MyClass1
from Father_class import Daddy

class Sonny(Daddy):
    def __init__(self):
        super(Daddy, self).__init__()
        self.bye=MyClass1()

否则,建议在导入中具体化并导入所需的定义:一旦需要重构任何东西,这将有很大的帮助。如果要显式地写下导入路径,您也会收到一条更合理的错误消息。在

相关问题 更多 >