2016-02-25 4 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 के रूप में बदल सकता हूं और यह काम करता है, लेकिन ऐसा करने के लिए गलत काम की तरह लगता है, मुख्य रूप से यह मेरी कॉल में प्रकारों की जांच करने की मेरी क्षमता को कम करता है। its_parent_org_unit के साथ एक प्रकार object होने के लिए बदल गया है तो सही परिणाम प्राप्त:

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

मैं विचारों और सुझावों के लिए खुला रहा हूँ। इस तरह की चीज करने के लिए सबसे अधिक "पायथनिक" तरीका क्या है?

पीएस: इस तरह के "स्वयं संदर्भ वर्ग" प्रतिमान/समस्या का नाम क्या है, जिसका उपयोग मैं अन्य सुझावों को देखने के लिए कर सकता था?

+1

कृपया पढ़ें [इस] (http://stackoverflow.com/questions/2489669/function-parameter-types-in-python) और गोता में "बतख टाइपिंग ";) – flaschbier

+2

टस्क, @flaschbier, अगर वह प्रकार संकेतों का उपयोग करना चाहता है, तो उसे चलो। –

उत्तर

14

आपकी समस्या यह है कि आप टाइप संकेतों का उपयोग करना चाहते हैं, लेकिन आप चाहते हैं कि यह वर्ग स्वयं अपने प्रकार के तर्क लेने में सक्षम हो।

प्रकार संकेत पीईपी (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

यह काम करता है, हालांकि यह किसी अमान्य प्रकार के साथ कोई समस्या नहीं उठाता है जैसे स्ट्रिंग जैसे: fail_case = OrgUnit ("Bad Unit", "a String")! इस मामले में कोई त्रुटि नहीं है। –

+0

"इस मामले में कोई त्रुटि नहीं है"? निष्पादन के दौरान? आप एक त्रुटि की उम्मीद क्यों करेंगे? –

+0

फिर से। "कोई त्रुटि नहीं है"। पायथन ** नहीं ** जावा _on उद्देश्य_ :-) – miraculixx

संबंधित मुद्दे