我运行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
关于我做错了什么的想法?
答案 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()
否则,建议在导入中具体使用并完全导入您需要的定义:只要需要重构,这将是非常有用的。如果您要明确记下导入路径,您还会收到更合理的错误消息。