次のコードを検討してください。
_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
クラスを出力します。
新しいスタイルのクラスを使用している場合(つまり、Python 2、または常にPython 3)のobject
から派生している場合)、 super()
で次のようにできます:
super(Derived, cls).do(a)
これは、メソッドの基本クラスのバージョンでコードを呼び出す方法です(つまり、print cls, a
)、派生クラスから、cls
が派生クラスに設定されます。
これはしばらくの間ですが、私は答えを見つけたかもしれないと思います。メソッドをデコレートしてクラスメソッドになると、元のバインドされていないメソッドは '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')