web-dev-qa-db-ja.com

Python super()はTypeErrorを発生させます

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)に置き換えると、動作します。これの説明は何ですか?

106
Geo

その理由は、 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
129
Cody Brocious

さらに、必要がない限りsuper()を使用しないでください。あなたが疑うかもしれない新しいスタイルのクラスを処理するのは、汎用的な「正しいこと」ではありません。

多重継承を期待していて、おそらくそれが必要な場合もありますが、MROの毛深い詳細がわかるまでは、MROをそのままにしておくことをお勧めします。

 X.a(self)
14
bobince

上記の回答のいずれにも明確に言及されていない場合。親クラスは「オブジェクト」から継承する必要があります。これにより、基本的に新しいオブジェクトがクラスになります。

# 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
3
Abhi Tk

さまざまなX.a()メソッドを試しました。ただし、a()を実行するにはXのインスタンスが必要なようです。そのため、X()。a(self)を実行しました。不必要な構築と破壊があるため、問題を処理する良い方法とは思えませんが、うまく機能します。

私の特定のアプリケーションはPythonのcmd.Cmdモジュールでしたが、これは何らかの理由で明らかにNewStyleオブジェクトではありません。

最終結果:

X().a(self)
1
weberc2