首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python模块与类

Python模块与类
EN

Stack Overflow用户
提问于 2015-03-31 17:53:57
回答 2查看 1.4K关注 0票数 3

我有以下目录结构:

代码语言:javascript
运行
复制
ican/
  __init__.py
  haz/
    __init__.py
    apple.py
    grape/
      __init.py
      grape.py

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-31 18:03:00

也要统一

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

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

然后,您的导入将是from ican.haz.apple import Applefrom ican.haz.grape import Grape (用于选项a);或from ican.haz import apple, grape (用于选项b)。

要获得所需的结构,请使用选项b并修改haz下的init

haz/__init__.py

代码语言:javascript
运行
复制
from .apple import Apple
from .grape import Grape

__all__ = ['Apple', 'Grape']

并将其导入为import ican.haz.* (不过,它被认为是糟糕的风格)。而且它正在对模块和类名~(不再是自类名更正后)进行破坏。最好在下面的一行中加上选项a或b。

顺便说一句,按照您目前的结构,进口产品需要:

代码语言:javascript
运行
复制
from ican.haz import apple
from ican.haz.grape import Grape

a = apple.Apple()
g = Grape()
票数 0
EN

Stack Overflow用户

发布于 2015-03-31 18:19:12

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

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

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

代码语言:javascript
运行
复制
class GetApple(object):
    def __init__(self):
        print("I have an apple!")

模块也可以有函数,因此您可以使用GetApple函数来代替:

代码语言:javascript
运行
复制
def GetApple():
    print("I have an apple!")

模块也可以有变量。它们可以有任意数量的变量、类和函数。您可以单独导入它们(例如使用from apple import GetApple ),也可以导入模块并从模块import apple访问它们。但是您不能导入然后调用一个模块(至少不能以任何合理的方式),只能导入它中的函数或类。

对于您的目录结构,可以使用以下任何一种方法运行它:

代码语言:javascript
运行
复制
>>> 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文件,可能还会:

代码语言:javascript
运行
复制
>>> import ican.haz
>>> ican.haz.apple.GetApple()
I have an apple!

>>> import ican
>>> ican.haz.apple.GetApple()
I have an apple!

对于grape.py,假设有一个相应的类,这类事情可以工作:

代码语言:javascript
运行
复制
>>> from ican.haz.grape.grape import GetGrape
>>> GetGrape()
I have a grape!
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29375231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档