2016-02-25 9 views
8

pojawia się błąd:typów parametrów dla obiektów typu, że to jest zdefiniowane

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) 

Jestem pewien, że jest to znany paradygmat, jak wydaje się to dość powszechne hierarchicznej problemu użytkowania klasa (klasa samoodniesienia). Wiem, że mogłem zmienić typ its_parent_org_unit na object i to działa, ale wydaje mi się, że jest to niewłaściwe, głównie dlatego, że obezwładnia moją zdolność sprawdzania typów w moich połączeniach. Z its_parent_org_unit zmienił się typ object uzyskać poprawne wyniki:

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

Jestem otwarty na myśli i sugestie. Jaki jest najbardziej "pythonic" sposób na zrobienie tego rodzaju rzeczy?

PS: Jaka jest nazwa tego rodzaju paradygmatu/problemu z "samodefiniowaniem klasy", który mógłbym wykorzystać do wyszukania innych sugestii?

+1

Proszę przeczytać [to] (http://stackoverflow.com/questions/2489669/function-parameter-types-in-python) i zanurzyć się „kaczka wpisując ";) – flaschbier

+2

Tsk, @flaschbier, jeśli chce używać podpowiedzi typu, pozwól mu. –

Odpowiedz

14

Twój problem polega na tym, że chcesz używać podpowiedzi typu, ale chcesz, aby ta sama klasa mogła przyjmować argumenty własnego typu.

Wskazówki dotyczące typów PEP (0484) wyjaśniają, że można używać string version of the type's name as a forward reference. Przykładem jest struktura danych o numerze Tree, która brzmi zaskakująco podobna do tej, która jest podobna do tej z OrgUnit.

Na przykład to działa:

class OrgUnit(object): 

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

To działa, ale nie powoduje żadnych problemów z nieprawidłowym typem, na przykład ciągiem znaków: failure_case = OrgUnit ("Bad Unit", "a String")! W tym przypadku nie ma błędu. –

+0

"W tym przypadku nie ma błędu"? Podczas wykonywania? Dlaczego spodziewałbyś się błędu? –

+0

re. "nie ma błędu". Python nie jest ** nie ** Java _on celem_ :-) – miraculixx