Frage

Kann ich eine übergeordnete Klasse zwingen, die Version einer Funktion einer abgeleiteten Klasse aufzurufen?

class Base(object):
    attr1 = ''
    attr2 = ''

    def virtual(self):
        pass               # doesn't do anything in the parent class

    def func(self):
        print "%s, %s" % (self.attr1, self.attr2)
        self.virtual()

und eine Klasse, die sich daraus ergibt

class Derived(Base):
    attr1 = 'I am in class Derived'
    attr2 = 'blah blah'

    def virtual(self):
        # do stuff...
        # do stuff...

Unbestimmtheit aufräumen:

d = Derived()
d.func()         # calls self.virtual() which is Base::virtual(), 
                 #  and I need it to be Derived::virtual()
War es hilfreich?

Lösung

Wenn Sie a instanziieren Derived (sagen d = Derived()), das .virtual Das heißt von von d.func() ist Derived.virtual. Wenn es kein Beispiel von gibt Derived beteiligt, dann gibt es keinen geeigneten self zum Derived.virtual Und so ist es natürlich unmöglich, es zu nennen.

Andere Tipps

Es ist nicht unmöglich - es gibt tatsächlich einen Weg, und Sie müssen nicht in der Funktion oder ähnlichem passieren. Ich arbeite selbst an einem Projekt, bei dem genau dieses Problem aufgetaucht ist. Hier ist die Lösung:


class Base(): # no need to explicitly derive object for it to work
    attr1 = 'I am in class Base'
    attr2 = 'halb halb'

    def virtual(self):
        print "Base's Method"

    def func(self):
        print "%s, %s" % (self.attr1, self.attr2)
        self.virtual()

class Derived(Base):
    attr1 = 'I am in class Derived'
    attr2 = 'blah blah'

    def __init__(self):
  # only way I've found so far is to edit the dict like this
        Base.__dict__['_Base_virtual'] = self.virtual

    def virtual(self):
        print "Derived's Method"

if __name__ == '__main__':
    d = Derived()
    d.func()

OK, ich habe gerade die Instanz von virtual () bestanden, die ich fungieren musste ()

class Base(object):
    attr1 = ''
    attr2 = ''

    def __init__(self):
        pass

    def virtual(self):
        pass

    def func(self, cb):
         print "%s, %s" % (self.attr1, self.attr2)
         cb()

class Derived(Base):
    attr1 = 'I am in class Derived'
    attr2 = 'blah blah'

    def virtual(self):
        # do stuff...
        # do stuff...


d = Derived()
d.func(d.virtual)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top