2015-01-17 25 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') 
相關問題