2011-10-10 4 views

答えて

14

型/クラスを持たない裸のsuper()呼び出しは使用できません。また、それが機能するような代替品を実装することもできません。 Pythonの3.xのは、裸super()呼び出しを(それはクラス内で定義されたすべての関数で__class__セル変数を配置可能にするための特別なサポートが含まれている - これはひどい「ソリューション」であるPEP 3135

+1

感謝を。このPEPの以前のバージョンでは 'from __future__ import new_super'を使ってインポートすると言っていたので混乱しました。これはうまくいきません。 –

6

いいえできません。しかし、Python 3のPython 2のsuper()をPython 3で使用することができます。

3

を参照してください、私はそれを投稿しますあなたが自宅でこれを実行しませんを確認してください
私は繰り返します!これを行わない

一つは、このミックスインに

class Super(object): 
    def super(self): 
     return super(self.__class__, self) 
を使用して考えることself.super()を取得する

class A(object, Super): 
    def __init__(self): 
     print "A" 

class B(A): 
    def __init__(self): 
     print "B" 
     self.super().__init__() 

>>> a = A() 
A 
>>> b = B() 
B 
A 

しかし、注意してください:をこのself.super()super(B, self)と同等ではありません - Aself.super().__init__()呼び出された場合、Bの建設は、原因となるがself.__class__Bのままであるため、Aコンストラクタは無期限に呼び出されます。 。これは、accepted answerに記載されている__class__の不足によるものです。この問題は、隠された状態マシンや洗練されたメタクラスなどで回避できます。実際のクラスの位置をself.__class__.mro()にチェックしますが、それは本当に価値がありますか?おそらく...

15

私はこの質問が古いことを認識しており、選択された回答は当時正しいかもしれませんが、もはや完全ではありません。あなたはまだ2.5.6でsuper()を使用することはできませんが、python-futureは2.6+のためのback-ported implementationを提供しています。

% pip install future 
... 
% python 
... 
>>> import sys 
>>> sys.version_info[:3] 
(2, 7, 9) 
>>> from builtins import * 
>>> super 
<function newsuper at 0x000000010b4832e0> 
>>> super.__module__ 
'future.builtins.newsuper' 
>>> class Foo(object): 
... def f(self): 
... print('foo') 
... 
>>> class Bar(Foo): 
... def f(self): 
... super().f() # <- whoomp, there it is 
... print('bar') 
... 
>>> b = Bar() 
>>> b.f() 
foo 
bar 

あなたがpylintを使用する場合は、コメントでレガシーの警告を無効にすることができます

# pylint: disable=missing-super-argument 
+0

いいね、ありがとう:) –

関連する問題