对Python的导入内包引用感到困惑

时间:2014-06-03 13:32:52

标签: python python-2.7 packages

我运行Python 2.7.6。我在创建包时遇到问题。以下是MWE:

我有以下文件:

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

具有以下内容:

初始化的.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

关于我做错了什么的想法?

2 个答案:

答案 0 :(得分:2)

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

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

如果您将__init__.py更改为

import Father_class
import Son_class
import class1

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

另外,convention states表示python模块名称是小写的。

答案 1 :(得分:1)

您只能导入相对于导入位置的模块,除非您导入的内容在site-packages全局或virtualenv中可用。因此,a中的模块Package/a无法通过导入b导航package/b中的模块package并从那里导航,但它可以直接导入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()

否则,建议在导入中具体使用并完全导入您需要的定义:只要需要重构,这将是非常有用的。如果您要明确记下导入路径,您还会收到更合理的错误消息。