我有以下目录结构:
ican/
__init__.py
haz/
__init__.py
apple.py
grape/
__init.py
grape.py
其中apple.py
和grape.py
具有水果类定义。在另一个测试文件中,我尝试通过类似于myapple = ican.haz.apple()
或mygrape = ican.haz.grape()
的内容加载水果类。
用于加载此类类的正确目录结构和import
结构是什么?我也尝试了import ican.haz as icanhaz
之类的内容,然后调用myapple = icanhaz.apple()
。我希望将所有课程放在同一个地方,并通过类似ican.haz.<class>
的内容加载它们。
答案 0 :(得分:1)
你混淆了两个概念。 python“module”是一个包含可以导入的python代码的文件。 python“类”是可以在模块中定义的东西。
在您的示例中,apple
和grape
是模块。您不能通过apple()
之类的操作来调用模块,这是不允许的。您需要导入模块中包含的类。
所以说apple.py
中定义了GetApple
类。所以apple.py
看起来像这样:
class GetApple(object):
def __init__(self):
print("I have an apple!")
模块也可以有函数,所以你可以改为使用GetApple
函数:
def GetApple():
print("I have an apple!")
模块也可以有变量。它们可以包含任意数量的变量,类和函数。您可以单独导入它们(例如使用from apple import GetApple
,也可以导入模块并从模块import apple
访问它们。但是您无法导入然后调用模块(至少不能以任何合理的方式) ,只有里面的函数或类。
对于您的目录结构,您可以使用以下任何一种方法运行它:
>>> from ican.haz.apple import GetApple
>>> GetApple()
I have an apple!
>>> from ican.haz import apple
>>> apple.GetApple()
I have an apple!
>>> import ican.haz.apple
>>> ican.haz.apple.GetApple()
I have an apple!
并且,根据您的__init__.py
文件,可能还有:
>>> import ican.haz
>>> ican.haz.apple.GetApple()
I have an apple!
>>> import ican
>>> ican.haz.apple.GetApple()
I have an apple!
对于grape.py
,假设有一个相应的类,这种事情会起作用:
>>> from ican.haz.grape.grape import GetGrape
>>> GetGrape()
I have a grape!
答案 1 :(得分:0)
要统一,要么
a)apple.py
应该在apple
文件夹中低一级init
或
b)grape.py
应该高一级,而不是在自己的grape
文件夹中。
然后您的导入将是from ican.haz.apple import Apple
和from ican.haz.grape import Grape
(对于选项a);或from ican.haz import apple, grape
(对于选项b)。
要获得所需的结构,请选择 b 选项并修改init
下的haz
。
haz/__init__.py
:
from .apple import Apple
from .grape import Grape
__all__ = ['Apple', 'Grape']
您可以将其导入为import ican.haz.*
(虽然认为风格不好)。它是〜修改模块与类名〜(自更正类名以来不再是)。最好使用下面的一行,选项a或b。
顺便说一句,根据您当前的结构进口需要:
from ican.haz import apple
from ican.haz.grape import Grape
a = apple.Apple()
g = Grape()