Python模块与类
我有以下目录结构:Python模块与类,python,Python,我有以下目录结构: 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()的方式加载一个水果类 加载此类类的正确目录结构和导入结构是什么?我还尝试了类似于将ican.
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()
的方式加载一个水果类
加载此类类的正确目录结构和导入结构是什么?我还尝试了类似于将ican.haz导入为icanhaz,然后调用myapple=icanhaz.apple()
。我希望将我所有的类放在同一个位置,并通过类似于ican.haz.
的方式加载它们,以实现统一
a) apple.py
在带有init
的apple
文件夹中应该低一级,或者
b) grape.py
应该更高一级,而不是在它自己的grape
文件夹中
然后您将从ican.haz.apple import apple导入,并从ican.haz.grape import grape导入(用于选项a);或来自ican.haz进口苹果、葡萄的(用于选项b)
要获得所需的结构,请使用选项b并修改haz
下的init
haz/\uuuuu init\uuuuuu.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()
你混淆了两个概念。python“模块”是一个包含可以导入的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!")
模块也可以有变量。它们可以有任意数量的变量、类和函数。您可以单独导入它们(例如使用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!
并且,根据您的\uuuu init\uuuu.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!
我得到了TypeError:“module”对象在我尝试以这种方式导入apple
时不可调用。但是,如果我使用ican.haz.apple中的将apple导入为apple
,我就可以创建a=apple()
。为什么这样做,但你的方式不行?因为你的类apple
在文件(module)中apple
~将更新我的答案,以确保区分大小写的正确性。~在经过多次编辑后,在手机上键入代码和标记并不是那么容易。它认为值得指出的是,在Python中,您没有义务将每个类放在自己的模块中(例如,通常在Java中)。如果您的Apple
和Grape
类足够简单,您可能希望将它们的代码放在同一个文件中(可能ican/has.py
),这样您就可以摆脱很多子包。