1. ホーム
  2. python

[解決済み] ベースクラスのプロパティが派生クラスで上書きされる場合、どのように呼び出すのですか?

2023-03-02 14:23:58

質問

私はいくつかのクラスを、ゲッターとセッターを多用したものから、よりパイソン的なプロパティの使い方に変えています。

しかし、今、私の以前のゲッターまたはセッターのいくつかは、ベースクラスの対応するメソッドを呼び出し、その後、何かを実行するので、私は行き詰っています。しかし、これはプロパティでどのように実現できるのでしょうか?親クラスのプロパティゲッターまたはセッターを呼び出すにはどうしたらよいでしょうか。

もちろん、ただ属性自体を呼び出すことは、無限の再帰を与えます。

class Foo(object):

    @property
    def bar(self):
        return 5

    @bar.setter
    def bar(self, a):
        print a

class FooBar(Foo):

    @property
    def bar(self):
        # return the same value
        # as in the base class
        return self.bar # --> recursion!

    @bar.setter
    def bar(self, c):
        # perform the same action
        # as in the base class
        self.bar = c    # --> recursion!
        # then do something else
        print 'something else'

fb = FooBar()
fb.bar = 7

どのように解決するのですか?

プロパティで呼び出されるベースクラスの関数を呼び出せばいいと思うかもしれません。

class FooBar(Foo):

    @property
    def bar(self):
        # return the same value
        # as in the base class
        return Foo.bar(self)

これが一番わかりやすいと思うのですが......。 は動作しません。なぜなら、bar はプロパティであり、callable ではないからです。

しかし、プロパティは単なるオブジェクトであり、対応する属性を見つけるためのゲッターメソッドを持っています。

class FooBar(Foo):

    @property
    def bar(self):
        # return the same value
        # as in the base class
        return Foo.bar.fget(self)