派生クラスでオーバーライドした基底クラスのメソッドをコールする方法は、次のように基底クラス内に定義された関数 (Unbound method) に派生クラスのオブジェクトを第一引数として渡すことで達成できます。
class Foo:
def x(self):
print("I'm Foo.")
class Bar(Foo):
def x(self):
Foo.x(self) # Unbound method を呼ぶ
実行結果は、
>>> b = Bar()
>>> b.x()
I'm Foo.
となります。同様に、派生クラスでオーバーライドした基底クラスのプロパティをコールするには、どうすればよいでしょうか。次がそのサンプルコードです。
class Foo:
def __init__(self):
self._y = "I'm Foo.y."
def x(self):
print("I'm Foo.")
@property
def y(self):
return self._y
@y.setter
def y(self, value):
self._y = value
class Bar(Foo):
def x(self):
Foo.x(self)
@property
def y(self):
return Foo.y.fget(self)
@y.setter
def y(self, value):
Foo.y.fset(self, value)
self._y += "I'm also Bar.y."
Barクラス内でのFoo.yというのはpropertyオブジェクトです。propertyオブジェクトについては参考1に説明があります。propertyオブジェクトは、fgetとfsetというメンバーを持っており、これらがそれぞれ元のgetter関数、setter関数を保持しています。ですので、基底クラスのプロパティFoo.yのメンバー、Foo.y.fgetとBar.y.fsetを呼ぶのが正解です。
実行してみます。
>>> b = Bar()
>>> b.y
"I'm Foo.y."
>>> b.y = "and "
>>> b.y
"and I'm also Bar.y."