Python親クラスで派生クラスの方法を使用していますか?
-
21-09-2019 - |
質問
親クラスに派生クラスのバージョンの関数を呼び出すように強制することはできますか?
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'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()
わかりました、私はちょうど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)
所属していません StackOverflow