goo blog サービス終了のお知らせ 

dullhikoのだるいブログ

殆ど日記のだるいブログ

Pythonで仮想関数みたいなことをするには

2005年09月04日 | Python
普通、仮想関数と言えば、(てか、俺はC++しか知らんのだけど)

基底クラス
baseclass::virtualfunc1()
派生クラス
derivclass::virtualfunc1()

こうなっていたら、baseclass内部でのvirtualfunc1()呼び出しも
全てderivclassのvirtualfunc1()として処理される。
単なる隠蔽では、baseclass内部での呼び出しまでは置き換えられない。
手軽なイベントハンドラ的な処理が可能だ。

pythonでは、これが単にオーバーライドするだけ(つまり継承側で同じ名前・同じ引数のメソッドを宣言するだけで)で、これを行える。まあ、細かい挙動は違うかもしれんけれども。

ただし。__なプライベートメソッドでは、この仮想関数的オーバーライドはできない(プライベートだから当然か…)
普通のpublicなメソッドでなければダメだ。
アンダースコア一個ならprotectedとかならよかったんだけど…まあ、そんなくだらないことに凝ってもしかたないから、別にいいのか。


ちなみに、同じ名前ではあるが違う引数の個数で宣言すると、元のメソッドは呼べなくなるようだ。多重定義はない、ということか。
具体的に書くとたとえば

class base:
  def internalMethod(self):
    print "base::internalMethod called"
  def func(self):
    self.internalMethod()

というベースクラスに対して

class deriv(base):
  def internalMethod(self):
    print "deriv::internalMethod called"

なら、
test = deriv()
test.func()
とすれば、deriv::internalMethod called という出力をエラーなしに得られるが

class deriv(base):
  def internalMethod(self,arg):
    print "deriv::internalMethod called = %s" % arg

などとしてしまうと、
test = deriv()
はともかく
test.func()
の時点で例外を発生して止まってしまうのであった。インタプリタだから当然…なのか?

最新の画像もっと見る