Python 2.5では、次のコードはTypeError
を発生させます:
_>>> class X:
def a(self):
print "a"
>>> class Y(X):
def a(self):
super(Y,self).a()
print "b"
>>> c = Y()
>>> c.a()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in a
TypeError: super() argument 1 must be type, not classobj
_
_class X
_をclass X(object)
に置き換えると、動作します。これの説明は何ですか?
その理由は、 super()
は 新しいスタイルのクラス でのみ動作するためです。これは、2.xシリーズではobject
からの拡張を意味します。
>>> class X(object):
def a(self):
print 'a'
>>> class Y(X):
def a(self):
super(Y, self).a()
print 'b'
>>> c = Y()
>>> c.a()
a
b
さらに、必要がない限りsuper()を使用しないでください。あなたが疑うかもしれない新しいスタイルのクラスを処理するのは、汎用的な「正しいこと」ではありません。
多重継承を期待していて、おそらくそれが必要な場合もありますが、MROの毛深い詳細がわかるまでは、MROをそのままにしておくことをお勧めします。
X.a(self)
上記の回答のいずれにも明確に言及されていない場合。親クラスは「オブジェクト」から継承する必要があります。これにより、基本的に新しいオブジェクトがクラスになります。
# python 3.x:
class ClassName(object): # This is a new style class
pass
class ClassName: # This is also a new style class ( implicit inheritance from object )
pass
# Python 2.x:
class ClassName(object): # This is a new style class
pass
class ClassName: # This is a old style class
pass
さまざまなX.a()メソッドを試しました。ただし、a()を実行するにはXのインスタンスが必要なようです。そのため、X()。a(self)を実行しました。不必要な構築と破壊があるため、問題を処理する良い方法とは思えませんが、うまく機能します。
私の特定のアプリケーションはPythonのcmd.Cmdモジュールでしたが、これは何らかの理由で明らかにNewStyleオブジェクトではありません。
最終結果:
X().a(self)