11

親クラスに派生クラスのバージョンの関数を呼び出すように強制できますか?

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

2 に答える 2

9

Derived(たとえばd = Derived())をインスタンス化する.virtualと、によって呼び出されるのd.func() Derived.virtualです。Derived関与するインスタンスがない場合、それにself適したものはないDerived.virtualので、もちろんそれを呼び出すことは不可能です。

于 2010-02-19T16:29:07.403 に答える
5

それは不可能ではありません。実際にはこれを回避する方法があり、関数などを渡す必要はありません。私はこの正確な問題が発生したプロジェクトに自分で取り組んでいます。解決策は次のとおりです。


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

于 2010-06-28T16:43:50.453 に答える