2016-12-14 36 views
3
class Node: 
    def append_child(self, node: Node): 
     if node != None: 
     self.first_child = node 
    self.child_nodes += [node] 

我該怎麼做node: Node?因爲當我運行它時,它說name 'Node' is not defined類別提示內一類

如果我只是刪除: Node和實例檢查它裏面的功能? 但是我怎麼能訪問node的屬性(我期望它是Node類的實例)?

我不知道如何在Python實現類型轉換,BTW。在類型檢查

回答

9

「自我」的引用是使用字符串通常所做:

class Node: 
    def append_child(self, node: 'Node'): 
     if node != None: 
     self.first_child = node 
    self.child_nodes += [node] 

這PEP-0484的"Forward references"部分中描述。

請注意,這沒有做任何類型檢查或鑄造。這是一種類型暗示其中蟒(通常)完全忽略。但是,第三方工具(如mypy)使用類型提示對代碼執行靜態分析,並可能在運行時產生錯誤。

的提示內省 - 所以,你可以用它們裝飾用或類似的,如果你真的想建什麼樣的運行時檢查的,但蟒蛇默認情況下不這樣做。

+0

謝謝!男人......從這門語言學到很多東西。即使是來自其他語言的最簡單的常見概念,在Python arrrgg中也有其獨特的方式。 –

0

如果您只想回答問題,請閱讀mgilson's answer

mgilson的答案提供了你應該如何解決此限制Python中的一個很好的解釋。但我認爲對有一個很好的理解也很重要,爲什麼這不起作用,所以我要提供解釋。

Python與其他語言有點不同。在Python中,確實沒有「聲明」這樣的東西。就Python而言,代碼只是代碼。當你導入一個模塊時,Python會創建一個新的命名空間(一個全局變量可以存在的地方),然後從上到下執行模塊的每一行。 def foo(args): code只是一個複合語句,它將一堆源代碼捆綁到一個函數中,並將該函數綁定到名稱foo。類似地,class Bar(bases): code創建類,執行所有的代碼立即,然後(單獨的名稱空間保持可能由代碼,特別是包括具有def創建方法創建的任何類級別的變量內)結合該類到名字Bar。它必須立即執行代碼,因爲所有的方法都需要立即創建。由於在綁定名稱之前代碼已被執行,因此不能引用代碼頂級的類。然而,引用方法內部的類是完全正確的,因爲代碼只有在方法被調用之後纔會運行。 (你可能想知道爲什麼我們不能只是先綁定名字然後執行代碼,結果是,由於Python實現類的方式,你必須知道在你之前存在哪些方法,在你之前甚至可以創建類對象。可以創建一個空類,然後將所有方法綁定到一個屬性賦值中(實際上,您可以通過編寫class Bar: pass,然後執行def method1():...; Bar.method1 = method1等手動執行此操作),但這樣做會導致更復雜的實現,並稍用力概念化,所以Python不這樣做)

在代碼中總結:

class C: 
    C # NameError: C doesn't exist yet. 
    def method(self): 
     return C # This is fine. By the time the method gets called, C will exist. 
C # This is fine; the class has been created by the time we hit this line.