質問: super()がエラーで失敗します:親がオブジェクトを継承しない場合、typeerror "引数1はclassobjではなく型でなければなりません" 理解できないエラーが発生します。サンプルコードのどこに問題があるのでしょうか。class b: def meth(self, arg): print arg class c(b): def meth(self, arg): super(c, self).meth(arg) print c().meth(1) 'super'組み込みメソッドのヘルプからサンプルテストコードを取得しました。クラス「c」はエラーは次のとおりです。traceback (most recent call last): file "./test.py", line 10, in ? print c().meth(1) file "./test.py", line 8, in meth super(c, self).meth(arg) typeerror: super() argument 1 must be type, not classobj 参考までに、これはpython自体のhelp(super)です。help on class super in module __builtin__: class super(object) | super(type) -> unbound super object | super(type, obj) -> bound super object; requires isinstance(obj, type) | super(type, type2) -> bound super object; requires issubclass(type2, type) | typical use to call a cooperative superclass method: | class c(b): | def meth(self, arg): | super(c, self).meth(arg) |
回答: あなたの問題は、クラスbが「新しいスタイル」のクラスとして宣言されていないことです。次のように変更します。class b(object): そしてそれは動作します。super()およびすべてのサブクラス/スーパークラスのものは、新しいスタイルのクラスでのみ機能します。クラス定義で(object)を常に入力して、新しいスタイルのクラスであることを確認することをお勧めします。古いスタイルのクラス(「クラシック」クラスとも呼ばれる)は、常にclassobj型です。新しいスタイルのクラスはtype型です。これがあなたが見たエラーメッセージを受け取った理由です:typeerror: super() argument 1 must be type, not classobjこれを試してみてください:class oldstyle: pass class newstyle(object): pass print type(oldstyle) # prints: <type 'classobj'> print type(newstyle) # prints <type 'type'> python 3.xでは、すべてのクラスが新しいスタイルであることに注意してください。古いスタイルのクラスの構文を引き続き使用できますが、新しいスタイルのクラスを取得します。したがって、python 3.xでは、この問題は発生しません。