1. ホーム
  2. python

[解決済み] Pythonで基底クラスのクラスメソッドを呼び出す

2022-08-16 17:50:43

質問

以下のコードを考えてみましょう。

class Base(object):

    @classmethod
    def do(cls, a):
        print cls, a

class Derived(Base):

    @classmethod
    def do(cls, a):
        print 'In derived!'
        # Base.do(cls, a) -- can't pass `cls`
        Base.do(a)

if __name__ == '__main__':
    d = Derived()
    d.do('hello')

> $ python play.py  
> In derived! 
> <class '__main__.Base'> msg

から Derived.do を呼び出すにはどうしたらよいでしょうか? Base.do ?

私は通常 super を使うか、あるいはこれが通常のオブジェクトメソッドであればベースクラス名を直接使うのですが、どうやらベースクラスでクラスメソッドを呼び出す方法が見つからないようです。

上の例では Base.do(a) が印刷されます。 Base クラスの代わりに Derived クラスの代わりに

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

新しいスタイルのクラス (すなわち object から派生したもの、または Python 3 では常に派生したもの) を使っている場合は、それを super() のようにします。

super(Derived, cls).do(a)

このように、ベースクラス版のメソッドにあるコードを呼び出すことになります(つまり print cls, a で、派生クラスから cls が派生クラスに設定されます。