Superargumente in Python
- Superargumente in Python
- Super verwendet Vererbungskonzept
- Genaue Verwendung von Superargumenten in Python
- Verwenden Sie Super, um Argumente an Konstruktoren in der Python-Mehrfachvererbung zu übergeben
 
Das Thema dieses Artikels verwendet die Python-Argumente super korrekt. Wir werden auch etwas über das Konzept von super und Vererbung, geeignete Codebeispiele mit super-Argumenten und das Konzept von Basisklassen lernen.
Superargumente in Python
In Python ruft super eine Methode einer anderen Klasse auf. Sie wird Elternklasse, Basisklasse oder Oberklasse genannt, wenn eine Klasse von einer anderen Klasse erbt.
Es ist ziemlich einfach, super zu verwenden, da es direkt zur übergeordneten Klasse geht und ihre Methoden aufruft.
An super können Argumente übergeben werden. Es braucht zwei Argumente, eine Klasse und eine Klasseninstanz.
Beispielcode:
class A:
    def roo(self):
        return "roo() from A"
class B(A):
    def roo(self):
        print("roo() from B")
        return super().roo()
class C(A):
    def roo(self):
        print("roo() from C")
        return super().roo()
class D(B, C):
    def roo(self):
        print("roo() from D")
        return super(C, self).roo()
a = A()
b = B()
c = C()
d = D()
print(a.roo())
print(b.roo())
print(c.roo())
print(d.roo())
Ausgang:
roo() from A
roo() from B
roo() from A
roo() from C
roo() from A
roo() from D
roo() from A
Super verwendet Vererbungskonzept
Vererbung mag Ihnen ungewohnt erscheinen, wenn Sie mit objektorientierten Programmierkonzepten nicht vertraut sind. In der objektorientierten Programmierung bezieht sich Vererbung auf die Fähigkeit einer Klasse, Attribute und Verhaltensweisen von einer anderen Klasse abzuleiten (oder zu erben), ohne sie erneut zu implementieren.
Der bequeme Weg, diese Konzepte zu verstehen, besteht darin, sich einen Code anzusehen. Lassen Sie uns also einige Klassen erstellen, um einige Formen zu beschreiben.
Beispielcode:
class Rectangle_Shape:
    def __init__(self, len, wid):
        self.length = len
        self.width = wid
    def area(self):
        return self.length * self.width
    def perimeters(self):
        return 2 * self.length + 2 * self.width
class Square_Shape:
    def __init__(self, len):
        self.length = len
    def area(self):
        return self.length * self.length
    def perimeters(self):
        return 4 * self.length
s = Square_Shape(4)
print(s.area())
r = Rectangle_Shape(3, 5)
print(r.area())
Diese Klasse hat zwei entsprechende Klassen: Rectangle_Shape und Square_Shape.
Ausgang:
16
15
Das Beispiel zeigt zwei Formen, die miteinander verwandt sind: Ein Quadrat ist eine Art Rechteck. Der Code spiegelt diese Beziehung nicht wider, was zu einem im Wesentlichen wiederholten Code führt.
Durch die Verwendung von Vererbung können Sie die Menge des von Ihnen geschriebenen Codes reduzieren und gleichzeitig die reale Beziehung zwischen Rechtecken und Quadraten widerspiegeln.
Beispielcode:
class Rectangle_Shape:
    def __init__(self, length, width):
        self.length = length
        self.width = width
    def area(self):
        return self.length * self.width
    def perimeters(self):
        return 2 * self.length + 2 * self.width
# Making the Square_Shape class that initiates the Rectangle_Shape class
class Square_Shape(Rectangle_Shape):
    def __init__(self, len):
        super().__init__(len, len)
s = Square_Shape(4)
print(s.area())
In diesem Fall ruft super() init() der Klasse Rectangle_Shape auf, die dann in der Klasse Square_Shape verwendet wird, ohne dass der Code neu geschrieben werden muss.
Ausgang:
16
Wie im Beispiel gezeigt, ist Rectangle_Shape die übergeordnete Klasse und Square_Shape die untergeordnete Klasse.
Genaue Verwendung von Superargumenten in Python
Der Code für die Klassen M, N und O ist unten.
class M:
    def __init__(self):
        print("M initiated successfully")
class N(M):
    def __init__(self):
        super().__init__()
        print("N initiated successfully")
class O(N):
    def __init__(self):
        super(O, self).__init__()
        print("O initiated successfully")
o = O()
Wie der obige Code annimmt, überladen alle Klassen ihre direkte Elternmethode init(). super() benötigt keine Attribute, daher reicht es aus, es ohne Argumente zu verwenden.
Ausgang:
M initiated successfully
N initiated successfully
O initiated successfully
Angenommen, wir möchten, dass die Klasse M2 die init()-Methode von N überspringt, aber stattdessen die init()-Methode von M ausführt. Die Methode init() sollte von M geerbt werden, nicht von N, obwohl der direkte Elternteil unserer Klasse N ist.
Hier kommt die Klasse M2. Werfen wir einen Blick auf seine Ausführung.
class M:
    def __init__(self):
        print("M initiated successfully")
class N(M):
    def __init__(self):
        super().__init__()
        print("N initiated successfully")
class O(N):
    def __init__(self):
        super(O, self).__init__()
        print("O initiated successfully")
class M2(N):
    def __init__(self):
        super(N, self).__init__()
        print("other O initiated successfully")
m2 = M2()
Aus dem obigen Code kann man annehmen, dass wir Attribute an die Methode super() übergeben, um diesmal die richtige Oberklasse auszuwählen. Als Ergebnis der Ausführung von m2 = M2() erhalten wir die folgende Ausgabe.
M initiated successfully
other O initiated successfully
Anstatt die direkt übergeordnete Methode __init__() aufzurufen, haben wir stattdessen die Python-Methode init() von M aufgerufen.
Für implizite Suchen mit diesen Anweisungen oder Operatoren wie super()[name] ist super() nicht definiert.
Darüber hinaus ist super() nicht auf die Verwendung von Insider-Methoden abgesehen von der Null-Argument-Form beschränkt. Die Verwendung der Form mit zwei Argumenten identifiziert die Argumente genau und stellt die entsprechenden Referenzen her.
In einer Klassendefinition funktionieren Nullargumente nur, weil der Compiler die erforderlichen Details zum Abrufen der Klasse und der Instanz ausfüllt.
Verwenden Sie Super, um Argumente an Konstruktoren in der Python-Mehrfachvererbung zu übergeben
Eine Basisklasse sollte auf Mehrfachvererbung ausgelegt sein, wenn es generell um verschiedene Vererbungen geht.
Es gibt Zeiten, in denen zwei Klassen ähnliche Parameternamen haben. In diesem Fall können Sie Schlüssel-Wert-Paare nicht aus **kwargs oder aus *args entfernen.
Es ist möglich, eine Base-Klasse zu definieren, die im Gegensatz zu einem Objekt Argumente aufnimmt/ignoriert.
Beispielcode:
class Base(object):
    def __init__(self, *args, **kwargs):
        pass
class P(Base):
    def __init__(self, *args, **kwargs):
        print("P")
        super(P, self).__init__(*args, **kwargs)
class Q(Base):
    def __init__(self, *args, **kwargs):
        print("Q")
        super(Q, self).__init__(*args, **kwargs)
class R(P):
    def __init__(self, arg, *args, **kwargs):
        print("R", "arguments=", arg)
        super(R, self).__init__(arg, *args, **kwargs)
class S(Q):
    def __init__(self, arg, *args, **kwargs):
        print("S", "arguments=", arg)
        super(S, self).__init__(arg, *args, **kwargs)
class T(R, S):
    def __init__(self, arg, *args, **kwargs):
        print("T", "arguments=", arg)
        super(T, self).__init__(arg, *args, **kwargs)
        print("MRO---", [x.__name__ for x in T.__mro__])
t = T(10)
Ausgang:
T arguments= 10
R arguments= 10
P
S arguments= 10
Q
MRO--- ['T', 'R', 'P', 'S', 'Q', 'Base', 'object']
Es ist wichtig zu beachten, dass Base die vorletzte Klasse in der MRO sein muss, damit dies funktioniert.
Die Programmiersprache Python bietet eine Vielzahl von Funktionen für die objektorientierte Programmierung. In diesem Satz spielen die Argumente der super-Funktion eine wichtige Rolle, insbesondere wenn sie richtig verwendet werden.
Hoffentlich hat Ihnen dieser Artikel geholfen, besser zu verstehen, wie Sie die Argumente der super-Funktion in Python verwenden.
My name is Abid Ullah, and I am a software engineer. I love writing articles on programming, and my favorite topics are Python, PHP, JavaScript, and Linux. I tend to provide solutions to people in programming problems through my articles. I believe that I can bring a lot to you with my skills, experience, and qualification in technical writing.
LinkedIn