派生クラスでオーバーライドした基底クラスのメソッドをコールする方法は、次のように基底クラス内に定義された関数 (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."