2017-03-21 2 views
0

Ich arbeite an einer Codebasis, die oop verwendet, und ich bin relavtiv neu dazu. Meine Frage speziell ist, warum NewMenuItem nicht von Datei erben?Wie funktioniert diese Python-Vererbungshierarchie? (spezifisches Beispiel)

Code Koje mit Code zu spielen: https://codebunk.com/b/350127244/

"" "Build Klassenhierarchie und erhalten Werte von decendants" ""

Import inspizieren

def Selbsttest():

class Menu(object): 
    def __init__(self): 
     super(Menu, self).__init__() 
     self.value = "Menu" 

class MenuBar(Menu): 
    #having object in there makes it a new style object, which allows us to use super 
    def __init__(self): 
     super(MenuBar, self).__init__() 
     self.value = "MenuBar" 


class File(MenuBar): 
    def __init__(self): 
     Menu.__init__() 
     super(File, self).__init__() 
     self.value = "File" 
     self.FileValue = "File here!" 

    class New(Menu): 
     def __init__(self): 
      Menu.__init__() 
      pass 

     class NewMenuItem(Menu): 
      def __init__(self): 
       """ 
       Q 1- Why do I need self here? 
       Menu.__init__(self) 

       """ 

       Menu.__init__(self) 
       pass 
      def show_vals(self): 
       print(self.value) 
      """ 
      Q 2 -why wont this work? 
      def show_vals2(self): 
       print(self.FileValue) 
      """ 

example = File.New.NewMenuItem() 
example.show_vals() 
""" 
Q 3 - Why do I get this error with this line? 
inspect.getmro(example) 

AttributeError: 'ManageProduct' object has no attribute '__bases__' 
""" 

Ich versuche zu verstehen, was Zeile für Zeile passiert, aber was ich nicht verstehe, ist, warum NewMenuItem nicht von Datei erbt.

Ich versuchte, die Instanziierung der Datei hart-Codierung, so: Datei. init()

aber dann bekomme ich einen Fehler, wenn ich das File-Objekt übergeben:

File.__init__(File()) 

Ich denke, was ich habe Schwierigkeiten mit ist:

-inheritance Bäume -super Klassen -Warum müssen wir Instanziierungen in diesem Fall hart codieren

Beachten Sie, dass dies der Code ist, auf den ich gestoßen bin. Ich bin mir nicht sicher, warum das so ist.

Antwort

0

Vererbung und Umfang sind zwei völlig verschiedene Dinge. NewMenuItem ist innerhalb des Gültigkeitsbereichs der Klasse New innerhalb des Gültigkeitsbereichs der Klasse File definiert, erbt aber von Menu, der von object erbt. Während also NewMenuItem nur über die Klasse File und wieder über New zugänglich ist, erbt es seine Methoden von Menu, und super wird sich auf Menu beziehen.

+0

Danke das macht so viel Sinn! –

Verwandte Themen