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