2017-05-07 73 views
1

我是python的新手,我對使用Pycharm的列表中的對象執行方法調用的自動完成有疑問。在PyCharm中未自動完成的類方法列表

我有一類叫做foo():

class foo(object): 

    def __init__(self): 
     self.num = 10 


    def getNum(self): 
     return self.num 

我然後創建一個名爲myList列表和foo()對象追加到它。出於某種原因,當我嘗試調用該對象時,該方法不顯示。

enter image description here

但是,如果我print(myList[0].getNum())完成代碼,它的確會打印出10

另外,如果我只需創建一個變量x並將其分配給一個foo()對象時,它會顯示了就好了,像這樣: enter image description here

我試圖創建一個y變量並將其分配給myList[0],看看我能得到的方法展現出來,但仍 沒有運氣。 enter image description here

這僅僅是一個IDE問題,或者是有一個更大的圖片,當我使用列表中的對象進行方法調用時,我缺少一個更大的圖片。

回答

3

原因是python有動態類型。沒有限制,myList只能包含foo對象。所以PyCharm無法知道myList [0]是一個foo來給你foo的自動完成(這隻在運行時才知道)。

拿這個例子:

class foo(object): 

    def __init__(self): 
     self.num = 10 


    def getNum(self): 
     return self.num 

class bar(object): 

    def __init__(self): 
     self.num = 10 


    def getNum2(self): 
     return self.num 

myList = [] 
myList.append(foo()) 
myList.append(bar()) 
print(myList[0]) 

PyCharm不知道是否給你自動完成foo的()或巴(),所以它不會給你任何。

關於x的最後一種情況是因爲您明確將x指定爲foo對象,因此Pycharm知道併爲您提供foo的自動完成。

+0

@NickWesenman謝謝。這給我清除了很多困惑。我唯一擔心的是如果你的程序變得非常大規模,並且你的類有很多方法。唯一能做的就是在代碼和類之間來回切換,看看裏面有哪些方法? – Nathan

+0

您已經發現使用動態類型語言的缺點。 :)是的,我經常在另一臺監視器上打開它,我不得不經常引用它。您將永遠無法獲得使用IntelliJ(JetBrains的靜態類型化Java版本)獲得的自動代碼完成。 –

1

林相當肯定這是一個IDE問題,因爲它可能不會追蹤變量一直回到它的原始調用,直到實際運行。所以你直接將x設置爲foo()是一個賦值,但設置y = myList [0],然後獲取myList [0]處的對象,如果有意義的話,該對象將是另一個回調變量。

+0

感謝您的輸入! – Nathan