Heim >Backend-Entwicklung >Python-Tutorial >Eingehende Analyse der Mehrfachvererbung in Python

Eingehende Analyse der Mehrfachvererbung in Python

巴扎黑
巴扎黑Original
2017-08-11 15:35:361952Durchsuche

In diesem Artikel werden hauptsächlich relevante Informationen zum Verständnis der Mehrfachvererbung in Python vorgestellt. Hier finden Sie Beispiele, die Ihnen beim Lernen und Nachschlagen helfen können >Python Mehrfachvererbung verstehen

Python unterstützt wie C++ die Mehrfachvererbung. Obwohl das Konzept einfach ist, besteht die schwierige Aufgabe darin, wenn eine Unterklasse ein Attribut aufruft, das nicht von ihr selbst definiert ist, in welcher Reihenfolge sie zur übergeordneten Klasse geht, um es zu finden, insbesondere wenn viele der übergeordneten Klassen das gleiche Attribut enthalten Name.

Die Suchreihenfolge der Attribute ist für klassische Klassen und Klassen im neuen Stil unterschiedlich. Schauen wir uns nun die beiden unterschiedlichen Leistungen der klassischen Klasse bzw. der neuen Klasse an:

Klassische Klasse:


Ausführung Das Ergebnis:

#! /usr/bin/python
# -*- coding:utf-8 -*-

class P1():
 def foo(self):
  print 'p1-foo'

class P2():
 def foo(self):
  print 'p2-foo'
 def bar(self):
  print 'p2-bar'

class C1(P1,P2):
 pass

class C2(P1,P2):
 def bar(self):
  print 'C2-bar'

class D(C1,C2):
 pass


if __name__ =='__main__':
 d=D()
 d.foo()
 d.bar()


Zeichnen Sie zum besseren Verständnis ein Bild des Codebeispiels:

p1-foo
p2-bar

From oben Gemessen an den Ausgabeergebnissen der klassischen Klasse

wenn Instanz d foo() aufruft, ist die Suchreihenfolge D => C1 => P1,

wenn Instanz d bar() aufruft , die Suchreihenfolge ist D => C1 => P2

Zusammenfassung: Die klassische Suchmethode besteht darin, Attribute „von links nach rechts, Tiefe zuerst“ zu finden . d sucht zunächst, ob es eine foo-Methode gibt. Wenn nicht, sucht es, ob die Methode in der nächsten übergeordneten Klasse C1 vorhanden ist. Wenn nicht, wird die Suche fortgesetzt, bis die Methode in P1 gefunden wird .

Neue Stilklasse:


Ausführungsergebnis:

#! /usr/bin/python
# -*- coding:utf-8 -*-

class P1(object):
 def foo(self):
  print 'p1-foo'
  
class P2(object):
 def foo(self):
  print 'p2-foo'
 def bar(self):
  print 'p2-bar'
  
class C1(P1,P2):
 pass
 
class C2(P1,P2):
 def bar(self):
  print 'C2-bar'
  
class D(C1,C2):
 pass 
 

if __name__ =='__main__':
 print D.__mro__ #只有新式类有__mro__属性,告诉查找顺序是怎样的
 d=D()
 d.foo()
 d.bar()


Den Ausgabeergebnissen der neuen Klasse oben nach zu urteilen, lautet die Suchreihenfolge, wenn

(<class &#39;__main__.D&#39;>, <class &#39;__main__.C1&#39;>, <class &#39;__main__.C2&#39;>, <class &#39;__main__.P1&#39;>, <class &#39;__main__.P2&#39;>, <type &#39;object&#39;>)

p1-foo
C2-bar
foo() aufruft: D => ; P1

Wenn Instanz d bar() aufruft, lautet die Suchreihenfolge D => C1 => Verwenden Sie die Methode „Breite zuerst“, um nach Immobilien zu suchen.

Das obige ist der detaillierte Inhalt vonEingehende Analyse der Mehrfachvererbung in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn