2015-01-17 24 views
1

我来自大多数Java背景,但最近一直在深入研究一些Python。我一直主要得到它,但有一些语法对我来说似乎很奇怪。我有我正在处理的这个项目,其中包含多个文件/类。我有一个类,Mesh.py:在另一个模块中使用类/函数

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

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

  1. 我不得不进口网,这似乎很奇怪,对我来说,因为它是在我的项目,
  2. 要创建一个网格我必须这样做:

    mesh = Mesh.Mesh('name') 
    

这似乎超级尴尬。为什么我不能只是做

mesh = Mesh('name') 

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

+2

Java会认为Foo类在文件Foo.java中。 Python没有这个要求,所以你需要提供文件和类名。随着你学习更多的语言,你应该更喜欢像tis这样的不同的约定。跟它一起滚。 – Gene

+0

为模块和班级指定不同的名称可能会说明发生了什么。 – zehnpaard

回答

4

在Python,每次创建文件是一个模块和模块的集合,可以进行逻辑分组的package。 Python与Java稍有不同,它允许在不明确导入的情况下使用相同包中的文件。

由于模块是名称空间,所以无论何时在模块中使用标识符,都必须在其中定义标识符,否则您将获得NameError

当导入模块,

import Mesh 

Python中了解到,在导入一个模块,并在其所有的项目可以与模块的名称引用。如果你

网(“名”)

,你会得到一个错误,因为只有Mesh模块当前模块,而不是Mesh类进口。这就是为什么你必须明确地指定

Mesh.Mesh('name') 

这意味着,你告诉Python的是,我这里指的是MeshMesh模块,这是我进口英寸

但在你的情况,你只能导入从Mesh模块到当前模块的命名空间中的某一类,像这样

from Mesh import Mesh 

然后创建它的一个对象,这样

Mesh('name') 
2

那么你能说出你的Mesh.py别的东西更englobing,不像Java中,你不需要你的.py模块中的类名,而不必只包含一个“顶层类”

否则你也可以做

from Mesh import Mesh 
Mesh('name') 
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()。尝试保存你的模块名称不同,你会明白。

1

我有一个类,Mesh.py

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

在Python中,您不应该自动遵循将每个类放入其自己的文件的Java模式。如果在多个文件变得太大且难以适应一个文件的情况下分解它们。如果你有很多小类(和/或函数和其他东西),就把它们放在一个文件中。那么你将不需要导入任何东西。如果你到了需要在多个文件中分割东西的地步,你将不会看到导入是一个问题,因为那时你的代码库将非常复杂,以至于分离成多个模块将提高代码的清晰度。

0

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

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

from Mesh import Mesh 
mesh = Mesh('name') 
相关问题