Python模块与类

2024-06-26 10:54:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下目录结构:

ican/
  __init__.py
  haz/
    __init__.py
    apple.py
    grape/
      __init.py
      grape.py

其中apple.py和{}有水果类定义。在另一个测试文件中,我试图通过类似于myapple = ican.haz.apple()mygrape = ican.haz.grape()的方式加载一个fruit类。在

加载此类类的正确目录结构和import结构是什么?我也尝试过类似import ican.haz as icanhaz的方法,然后调用myapple = icanhaz.apple()。我希望将我所有的类放在同一个位置,并通过类似ican.haz.<class>的方式加载它们。在


Tags: 文件pyimport目录apple定义init方式
2条回答

你混淆了两个概念。python“模块”是一个包含可以导入的python代码的文件。python“类”是可以在模块中定义的东西。在

在您的示例中,apple和{}是模块。不能通过执行apple()之类的操作来调用模块,这是不允许的。您需要导入模块中包含的类。在

所以假设apple.py中定义了一个GetApple类。所以apple.py看起来是这样的:

class GetApple(object):
    def __init__(self):
        print("I have an apple!")

模块也可以有函数,因此可以使用GetApple函数:

^{pr2}$

模块也可以有变量。它们可以有任意数量的变量、类和函数。您可以单独导入它们(例如使用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!

也要穿制服

a)apple.py应该在apple文件夹中低一级,或者

b)grape.py应该高一级,而不是在它自己的grape文件夹中。在

那么您的导入将是from ican.haz.apple import Apple和{}(对于选项a);或者{}(对于选项b)。在

要获得所需的结构,请使用optionb并修改haz下的init。在

haz/__init__.py

from .apple import Apple
from .grape import Grape

__all__ = ['Apple', 'Grape']

您可以将其导入为import ican.haz.*(尽管被认为是坏样式)。而且它是~弄乱模块vs类名~,因为类名被更正了。最好将下面的一行与选项a或b一起使用

顺便说一句,根据你目前的结构,进口量需要是:

^{pr2}$

相关问题 更多 >