2012-11-13 70 views
5

一段代碼的作品,我不明白爲什麼。它不應該從我的理解。問題是出在下面很容易:我們什麼時候需要Python導入語句?

「Main.py」

from x import * #class x is defined 
from y import * #class y is defined 


xTypeObj = x() 
yTypeObj = y() 
yTypeObj.func(xTypeObj) 

「x.py」

class x(object): 

    def __init__... 
     ... 
    def functionThatReturnsAString(self): 
     return "blah" 

「y.py」

#NO IMPORT STATEMENT NEEDED?? WHY 

class y(object): 
    def __init__... 
     ... 
    def func(self, objOfTypeX): 
     print(objOfTypeX.functionThatReturnsAString()) 

我的問題是爲什麼我不需要在類型爲「y.py」的進口聲明

from x import functionThatReturnAString() 

它是如何找出如何調用這個方法的?

+0

您談談類和調用一些方法,但是你的模塊只定義功能,而不是類和方法... #confusion – heltonbiker

+4

你真的* *想學習[Python的教程(HTTP://docs.python。 org/2/tutorial /),尤其是[關於類的部分](http://docs.python.org/2/tutorial/classes.html)。 –

+0

您將它作爲參數傳入。 – Keith

回答

3

Python是一種動態類型語言。與靜態類型的語言(如C++和Java)不同,調用方法在實際執行之前不會被綁定,因此爲什麼導入模塊並不需要定義方法。這有幾方面的含義:

  1. 方法(和數據成員)可以添加到並在運行時從實例中刪除,因此類Foo的兩個實例,實際上可以有,即使它們是同一類型的不同方法。
  2. 方法(和數據成員)可以在運行時添加到類中或從類中刪除,這會影響當前所有實例以及新實例。
  3. 在運行時可以添加和刪除基類。

請注意,這並不是動態類型語言和靜態類型語言之間所有區別的詳盡列表。

+0

「與像C++和Java的靜態類型語言調用方法不綁定,直到它們被實際執行,從而爲什麼導入模塊是該方法的定義是沒有必要的」 ---完全的答案我一直在尋找。謝謝! – Tommy

1

功能yTypeObj.funcmain.py調用,其中類是導入。因此,該對象可以構造並傳遞給函數,其所有方法(functionThatReturnAStringobjOfTypeX的方法)。

+0

所以我不太明白什麼時候需要進口。不在任何調用另一個類的方法的類中,因爲y調用了x的函數。 – Tommy

+0

當你想定義一個新的對象時,你需要導入類(或任何其他屬性)。否則,你不會有一個配方來構造一個新的對象。你可以將對象傳遞給你喜歡的任何函數(這不需要知道存在這樣的類) – btel

9

Python是一種面向對象的編程語言。在這種語言中,值是對象,對象可以有方法。

functionThatReturnsAString函數是一個類的方法,並且objOfTypeX是該類的實例。一個階級的實例攜帶着它的所有方法。

這就是爲什麼,例如,在Python list對象有一個.append()方法:

>>> alist = [] 
>>> alist.append(1) 
>>> alist 
[1] 

list類有一個.append()方法,而你並不需要導入方法能夠調用它。所有你需要的是對列表實例的引用。

從技術上講,一條巨蟒list,但這種區別並不重要,在這裏。總體而言,爲了討論的目的,類型與類相同。

請仔細閱讀Python Tutorial,它會在後面的章節中解釋類(但您可能需要先瀏覽第一組章節)。

+1

我的回答是正確的,沒有幫助。跟Martijn一起去。 :-) –

+0

你的答案就好像我比我更無知。問題不在於「面向對象」,我知道一個類的實例是什麼......我來自C++世界。問題來自「動態與靜態類型」。在C++中,y.py,你必須包括一個頭,讓objOfTypeX.functionThatReturnsAString(簽名),否則在編譯時會說「objOfTypeX沒有名爲...的方法」。在python中,我猜它會在運行時查找此方法,否則會引發錯誤。你的回答沒有涉及到,所以我接受了另一個。 – Tommy

+0

也就是說,我不確定爲什麼本功能()不需要被告知,該方法functionThatReturnsAString()確實存在,因爲你必須在C「證明」 ++告訴y.py,這個功能確實存在。我不知道python不需要這樣的證明,只是在運行時炸彈說「這個函數不像你說的那樣存在」。 – Tommy

相關問題