781 Stimmen

Wie rufe ich die Methode einer Elternklasse von einer Kindklasse in Python auf?

Bei der Erstellung einer einfachen Objekthierarchie in Python möchte ich die Methoden der übergeordneten Klasse von einer abgeleiteten Klasse aus aufrufen können. In Perl und Java gibt es dafür ein Schlüsselwort ( super ). In Perl könnte ich dies tun:

package Foo;

sub frotz {
    return "Bamf";
}

package Bar;
@ISA = qw(Foo);

sub frotz {
   my $str = SUPER::frotz();
   return uc($str);
}

In Python scheint es, dass ich die übergeordnete Klasse explizit nach der untergeordneten benennen muss. In dem obigen Beispiel müsste ich etwas tun wie Foo::frotz() .

Dies scheint nicht richtig zu sein, da dieses Verhalten es schwierig macht, tiefe Hierarchien zu erstellen. Wenn Kinder wissen müssen, welche Klasse eine geerbte Methode definiert hat, entstehen alle Arten von Informationsschmerzen.

Ist dies eine tatsächliche Einschränkung in Python, eine Lücke in meinem Verständnis oder beides?

3 Stimmen

Ich denke, dass die Benennung der übergeordneten Klasse keine so schlechte Idee ist. Es kann hilfreich sein, wenn die Kindklasse von mehr als einer Elternklasse erbt, da Sie die Elternklasse explizit benennen.

8 Stimmen

Die Möglichkeit, eine Klasse zu benennen, ist zwar keine schlechte Idee, aber dazu gezwungen zu werden, ist es schon.

0 Stimmen

Beachten Sie die Änderungen in der Superbehandlung zwischen Python 2 und Python 3 https://www.python.org/dev/peps/pep-3135/ . Die Benennung der Klasse ist nicht mehr erforderlich (obwohl sie zumindest manchmal immer noch eine gute Idee sein kann).

14voto

lawrence Punkte 9099

Auch in Python gibt es ein super(). Es ist ein bisschen eigenwillig, wegen Pythons Klassen im alten und neuen Stil, aber es wird ziemlich häufig verwendet, z.B. in Konstruktoren:

class Foo(Bar):
    def __init__(self):
        super(Foo, self).__init__()
        self.baz = 5

9voto

Joran Beasley Punkte 102210

Ich würde die Verwendung von CLASS.__bases__ etwas wie dies

class A:
   def __init__(self):
        print "I am Class %s"%self.__class__.__name__
        for parentClass in self.__class__.__bases__:
              print "   I am inherited from:",parentClass.__name__
              #parentClass.foo(self) <- call parents function with self as first param
class B(A):pass
class C(B):pass
a,b,c = A(),B(),C()

2 Stimmen

Bedenken Sie, dass, wie Sie an der Menge der Verweise auf super hier, dass die Leute es wirklich ablehnen, die Grundlagen es sei denn, Sie tun etwas wirklich Tiefgreifendes. Wenn Sie es nicht mögen super , siehe mro . Nimmt man den ersten Eintrag in mro ist sicherer als zu verfolgen, welcher Eintrag in Grundlagen zu verwenden. Die Mehrfachvererbung in Python scannt bestimmte Dinge rückwärts und andere vorwärts, so dass es am sichersten ist, die Sprache den Prozess abwickeln zu lassen.

9voto

Robin Winslow Punkte 10050

Wenn Sie nicht wissen, wie viele Argumente Sie bekommen könnten, und diese auch an das Kind weitergeben wollen:

class Foo(bar)
    def baz(self, arg, *args, **kwargs):
        # ... Do your thing
        return super(Foo, self).baz(arg, *args, **kwargs)

(Von: Python - Sauberste Weg zu überschreiben __init__ wo eine optionale kwarg muss nach dem super() Aufruf verwendet werden? )

5voto

kkk Punkte 1750

Auch in Python gibt es ein super().

Beispiel dafür, wie eine Oberklassenmethode von einer Unterklassenmethode aufgerufen wird

class Dog(object):
    name = ''
    moves = []

    def __init__(self, name):
        self.name = name

    def moves_setup(self,x):
        self.moves.append('walk')
        self.moves.append('run')
        self.moves.append(x)
    def get_moves(self):
        return self.moves

class Superdog(Dog):

    #Let's try to append new fly ability to our Superdog
    def moves_setup(self):
        #Set default moves by calling method of parent class
        super().moves_setup("hello world")
        self.moves.append('fly')
dog = Superdog('Freddy')
print (dog.name)
dog.moves_setup()
print (dog.get_moves()) 

Dieses Beispiel ist ähnlich wie das oben beschriebene, jedoch mit dem Unterschied, dass super keine Argumente übergeben werden. Dieser Code ist in der Python-Version 3.4 ausführbar.

2voto

maryam mehboob Punkte 148
class department:
    campus_name="attock"
    def printer(self):
        print(self.campus_name)

class CS_dept(department):
    def overr_CS(self):
        department.printer(self)
        print("i am child class1")

c=CS_dept()
c.overr_CS()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X