Python, используя метод производного класса в родительском классе? - PullRequest
10 голосов
/ 19 февраля 2010

Могу ли я заставить родительский класс вызывать версию функции производного класса?

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()

Ответы [ 3 ]

9 голосов
/ 19 февраля 2010

Если вы создаете экземпляр Derived (скажем, d = Derived()), .virtual, который называется d.func() , равен Derived.virtual. Если не задействован ни один экземпляр Derived, тогда нет подходящего self для Derived.virtual, и поэтому, конечно, его нельзя назвать.

4 голосов
/ 28 июня 2010

Это не невозможно - на самом деле есть способ обойти это, и вам не нужно передавать функцию или что-то подобное.Я сам работаю над проектом, в котором возникла именно эта проблема.Вот решение:


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()

0 голосов
/ 19 февраля 2010

Хорошо, я только что закончил передавать экземпляр virtual (), который мне нужен, для func ()

...