2016-02-25 2 views
8

私はエラーを取得する:タイプ

NameError: name 'OrgUnit' is not defined 
class OrgUnit(object): 

    def __init__(self, 
       an_org_name: str, 
       its_parent_org_unit: OrgUnit= None 
       ): 
     self.org_unit_name = an_org_name 
     self.parent_org_unit = its_parent_org_unit 

    def __str__(self): 
     if self.parent_org_unit: 
      parent_org_unit_name = self.parent_org_unit.__str__() 
      return parent_org_unit_name + "->" + self.org_unit_name 
     else: 
      return self.org_unit_name 


if __name__ == '__main__': 
    ibm_worldwide = OrgUnit("IBM_Worldwide") 
    ibm_usa = OrgUnit("IBM_USA", ibm_worldwide) 
    ibm_asia = OrgUnit("IBM_Asia", ibm_worldwide) 
    ibm_china = OrgUnit("IBM_China", ibm_asia) 
    print(ibm_worldwide) 
    print(ibm_usa) 
    print(ibm_asia) 
    print(ibm_china) 

私はそれが(かなり一般的階層クラスの使用方法の問題のように思える、これは、知られているパラダイムであると確信しています自己参照クラス)。 its_parent_org_unitのタイプをobjectに変更することができますが、それはうまくいかないようですが、主に自分の通話でタイプをチェックする能力があるためです。

IBM_Worldwide 
IBM_Worldwide->IBM_USA 
IBM_Worldwide->IBM_Asia 
IBM_Worldwide->IBM_Asia->IBM_China 

私は考えや提案を開いています:its_parent_org_unitで、私は、正しい結果を得るタイプobjectに変更。このようなことをする最も「ピジョンソニック」な方法は何ですか?

PS:この種の「自己参照クラス」のパラダイム/問題の名前は何ですか?私は他の提案を参照することができますか?

+1

は、[この](http://stackoverflow.com/questions/2489669/function-parameter-types-in-python)とダイビングに「ダックタイピングお読みください";) – flaschbier

+2

Tsk、@flaschbier、もし彼がタイプヒントを使いたいなら、彼に任せてください。 –

答えて

14

問題は、タイプヒントを使用したいが、このクラス自体が独自の型の引数を取ることができるようにすることです。

タイプヒントPEP(0484)は、string version of the type's name as a forward referenceを使用できると説明しています。この例にはTreeのデータ構造があり、これはこのOrgUnitと著しく類似しています。

例えば、これは動作します:

class OrgUnit(object): 

    def __init__(self, 
       an_org_name: str, 
       its_parent_org_unit: 'OrgUnit' = None 
       ): 
+0

これはうまくいきますが、文字列などの無効なタイプの問題は発生しません。たとえば、failure_case = OrgUnit( "Bad Unit"、 "a String")!この場合、エラーはありません。 –

+0

"この場合エラーはありません"?実行中ですか?なぜあなたはエラーを予期しますか? –

+0

re。 "エラーはありません"。 Pythonは** Java **の目的ではありません**: – miraculixx