0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

基底クラスのプロパティを呼ぶ方法

Posted at

派生クラスでオーバーライドした基底クラスのメソッドをコールする方法は、次のように基底クラス内に定義された関数 (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オブジェクトは、fgetfsetというメンバーを持っており、これらがそれぞれ元のgetter関数、setter関数を保持しています。ですので、基底クラスのプロパティFoo.yのメンバー、Foo.y.fgetBar.y.fsetを呼ぶのが正解です。

実行してみます。

>>> b = Bar()
>>> b.y
"I'm Foo.y."
>>> b.y = "and "
>>> b.y
"and I'm also Bar.y."

参考1: Pythonのプロパティ記述はよく見るとおかしい(さらによく考えればおかしくない)

参考2: https://stackoverflow.com/questions/1021464/how-to-call-a-property-of-the-base-class-if-this-property-is-being-overwritten-i

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?