2011-01-13 10 views
7

superを使用して、クラスのスーパークラスのメソッドを取得できないのはなぜですか?Python:なぜクラスで `super`を使うことができませんか?

例:

Python 3.1.3 
>>> class A(object): 
...  def my_method(self): pass 
>>> class B(A): 
...  def my_method(self): pass 
>>> super(B).my_method 
Traceback (most recent call last): 
    File "<pyshell#2>", line 1, in <module> 
    super(B).my_method 
AttributeError: 'super' object has no attribute 'my_method' 

(もちろんこれは、私はちょうどA.my_methodを行うことができ些細なケースですが、私はダイヤモンド継承の場合のためにこれを必要としていました。)

super年代によると、私が望んでいるものが可能でなければならないようです。これはsuperのドキュメントである:(重点鉱山)

super() - >結合していないスーパーのオブジェクト

super(type, obj) - - super(__class__, <first argument>)

super(type)と同じ>>バインドsuper オブジェクト。必要なもの:isinstance(obj, type)

super(type、type2) - > bound super オブジェクトです。 2番目の引数として渡すためにBのインスタンスを必要としているように見えますissubclass(type2は、 タイプ)

[編集済みの非関連の例]

+0

私は私の答えを削除した - 私は同じエラーを得ました。非常に奇妙な、それをもう少し見ていきます。 –

答えて

7

thisによると、私はちょうどsuper(B, B).my_methodを呼び出す必要があるように思える:

>>> super(B, B).my_method 
<function my_method at 0x00D51738> 
>>> super(B, B).my_method is A.my_method 
True 
+0

興味深い。それがうまくいくのを知らなかった。 – James

+1

リンク元の助けになりました。 :) – James

+3

これはあなたにバインドされていないメソッドを与えることに注意してください。あなたが通常 'super(B、self)'と言う必要がある理由は、オブジェクトにバインドされたスーパーオブジェクトを取得し、バインドされたメソッドを取得することです。 –

8
+0

+1、この記事シリーズの第2/3部では、「バインドされていないスーパーオブジェクト」の正確な問題と実際の使用例について説明しています。http://www.artima.com/weblogs/viewpost.jsp?thread=236278(縛られていないスーパーオブジェクトの秘密) – ChristopheD

関連する問題