Python en utilisant la méthode dérivée de la classe en classe mère?
-
21-09-2019 - |
Question
Puis-je forcer une classe parente d'appeler une version de classe dérivée d'une fonction?
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()
et une classe qui en dérive
class Derived(Base):
attr1 = 'I am in class Derived'
attr2 = 'blah blah'
def virtual(self):
# do stuff...
# do stuff...
vague de déblayage:
d = Derived()
d.func() # calls self.virtual() which is Base::virtual(),
# and I need it to be Derived::virtual()
La solution
Si vous instancier un Derived
(disons d = Derived()
), le .virtual
qui est appelé par d.func()
est Derived.virtual
. S'il n'y a aucune instance de Derived
impliqué, alors il n'y a pas self
approprié pour Derived.virtual
et donc bien sûr, il est impossible de l'appeler.
Autres conseils
Il est impossible - il y a un moyen de contourner cette réalité, et vous ne devez pas passer dans la fonction ou quelque chose comme ça. Je travaille sur moi-même projet où ce problème exact est venu. Voici la solution:
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, je viens fini par passer l'instance que je avais besoin virtuel () à func ()
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)