Ответ 1
Если вы создаете экземпляр Derived
(скажем d = Derived()
), .virtual
, вызываемый d.func()
, Derived.virtual
. Если нет экземпляра Derived
, то нет подходящего self
для Derived.virtual
и поэтому, конечно, его невозможно назвать.
Могу ли я заставить родительский класс вызывать производную версию функции?
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()
и класс, который вытекает из него
class Derived(Base):
attr1 = 'I am in class Derived'
attr2 = 'blah blah'
def virtual(self):
# do stuff...
# do stuff...
Устранение неопределенности:
d = Derived()
d.func() # calls self.virtual() which is Base::virtual(),
# and I need it to be Derived::virtual()
Если вы создаете экземпляр Derived
(скажем d = Derived()
), .virtual
, вызываемый d.func()
, Derived.virtual
. Если нет экземпляра Derived
, то нет подходящего self
для Derived.virtual
и поэтому, конечно, его невозможно назвать.
Это не невозможно - на самом деле есть способ, и вам не нужно проходить функцию или что-то в этом роде. Я сам работаю над проектом, где возникла эта точная проблема. Вот решение:
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 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 Method"
if __name__ == '__main__':
d = Derived()
d.func()
Хорошо, я просто закончил тем, что передал экземпляр virtual(), который мне нужен для 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)