在另一个模块中使用类/函数

时间:2015-01-17 03:36:48

标签: python

我来自一个主要是Java的背景,但最近已经深入研究了一些Python。我一直都是这样做的,但是有些语法对我来说似乎很奇怪。我正在研究这个包含多个文件/类的项目。我有一个类,Mesh.py:

class Mesh:
    def __init__(self, name):
        #dostuff

我想在另一个文件Main.py中实例化。我注意到了两件事,

  1. 我必须导入Mesh,这对我来说很奇怪,因为它在我的项目中,
  2. 要创建网格,我必须这样做:

    mesh = Mesh.Mesh('name')
    
  3. 这似乎超级尴尬。为什么我不能这样做

    mesh = Mesh('name')
    

    我在这里做错了什么,或者这只是Python不可避免的一部分?

5 个答案:

答案 0 :(得分:4)

在Python中,您创建的每个文件都是一个模块,模块集合可以在逻辑上分组为package。 Python与Java略有不同,它允许使用同一个包中的文件而无需显式导入。

由于模块是名称空间,因此每当您在模块中使用标识符时,必须在其中定义标识符,否则您将获得NameError

导入模块时,

import Mesh

Python了解您已导入模块,并且可以使用模块的名称引用其中的所有项目。如果你这样做

网( '姓名')

您将收到错误,因为只有Mesh模块在​​当前模块中导入,而不是Mesh类。这就是你必须明确指定

的原因
Mesh.Mesh('name')

这意味着,您告诉Python,我指的是我导入的Mesh模块中的Mesh类。

但在您的情况下,您只能将Mesh模块中的特定类导入当前模块的命名空间,如下所示

from Mesh import Mesh

然后创建一个对象,就像这样

Mesh('name')

答案 1 :(得分:2)

嗯,你可以将你的Mesh.py命名为其他更有趣的东西,与Java不同,你的.py模块中不需要类名,而且不必只包含一个“顶级类”

否则你也可以

from Mesh import Mesh
Mesh('name')

答案 2 :(得分:1)

如果您使用模块,您应该知道,例如random模块有一个方法randint。如果你这样做;

import random

你必须使用randint方法,如;

random.randint()

但是如果你只想使用randint方法,你可以这样做;

from random import randint

然后你就可以使用它了;

randint()

所以你的模块名称是Mesh.py,如果你像导入它那样;

import Mesh

您必须在Mesh模块中使用Mesh方法;

Mesh.Mesh()

正如您在random模块中看到的那样。所以你必须像它一样导入它;

from Mesh import Mesh
Mesh()

由于您的模块名称为Mesh,如果您将模块保存为ChuckNorris,则必须执行此操作;

from ChuckNorris import Mesh
Mesh()

import ChuckNorris
ChuckNorris.Mesh()
在Python中

记住,每个脚本基本上都是一个模块。您感到困惑,因为您的脚本/模块名称为Mesh,并且此脚本/模块有一个名为Mesh的方法。这就是为什么你import Mesh必须使用它Mesh.Mesh()。尝试保存您的模块名称不同,您将理解。

答案 3 :(得分:1)

  

我有一个类,Mesh.py

对,有问题。 Mesh.py不是一个类,它是一个文件,这意味着它是一个模块。

在Python中,您不应该自动遵循将每个类放在自己的文件中的Java模式。如果多个文件变得太大而且难以置身于一个文件中,则会在多个文件之间进行分解。如果您有许多小类(和/或函数和其他东西),只需将它们放在一个文件中即可。然后你不必进口任何东西。如果你需要在多个文件之间进行拆分,那么你就不会将导入视为一个问题,因为在那时你的代码库将足够复杂,以至于分离成多个模块将提高代码清晰度。

答案 4 :(得分:0)

如果您正在引用具有该定义的模块(即Mesh.py)中的类,则根本不必导入。在这种情况下,Mesh(类)位于模块级命名空间中。值得注意的是,因为你可以在一个模块中拥有你想要的多个类。

将Mesh(类)放入模块级命名空间的另一种方法是从定义它的模块(或导入它的任何其他模块)中导入它。像:

from Mesh import Mesh
mesh = Mesh('name')