Python mit der Methode der abgeleiteten Klasse in der übergeordneten Klasse?
-
21-09-2019 - |
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()
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)