Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python模块与类_Python - Fatal编程技术网

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
),这样您就可以摆脱很多子包。