web-dev-qa-db-ja.com

Python _で基本クラスのクラスメソッドを呼び出します

次のコードを検討してください。

_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 __== '__main__':
    d = Derived()
    d.do('hello')

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

_Derived.do_から、どのように_Base.do_を呼び出すのですか?

通常、これが通常のオブジェクトメソッドである場合、superまたは基本クラス名さえ直接使用しますが、どうやら基本クラスでclassmethodを呼び出す方法が見つかりません。

上記の例では、Base.do(a)Baseクラスの代わりにDerivedクラスを出力します。

91

新しいスタイルのクラスを使用している場合(つまり、Python 2、または常にPython 3)のobjectから派生している場合)、 super()で次のようにできます:

super(Derived, cls).do(a)

これは、メソッドの基本クラスのバージョンでコードを呼び出す方法です(つまり、print cls, a)、派生クラスから、clsが派生クラスに設定されます。

107
David Z

これはしばらくの間ですが、私は答えを見つけたかもしれないと思います。メソッドをデコレートしてクラスメソッドになると、元のバインドされていないメソッドは 'im_func'という名前のプロパティに保存されます。

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.im_func(cls, a)

if __== '__main__':
    d = Derived()
    d.do('hello')
13
Nikolas