我来自一个主要是Java的背景,但最近已经深入研究了一些Python。我一直都是这样做的,但是有些语法对我来说似乎很奇怪。我正在研究这个包含多个文件/类的项目。我有一个类,Mesh.py:
class Mesh:
def __init__(self, name):
#dostuff
我想在另一个文件Main.py中实例化。我注意到了两件事,
要创建网格,我必须这样做:
mesh = Mesh.Mesh('name')
这似乎超级尴尬。为什么我不能这样做
mesh = Mesh('name')
我在这里做错了什么,或者这只是Python不可避免的一部分?
答案 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')