2017-03-19 4 views
3

は私がのpython3にpython2から何かを移植しようとしたし、次のクラスに関するエラーに直面したスーパー()

class Bound(tuple): 
    # some methods skipped… 

    def __new__(cls, value, is_closed): 
     if value is NegativeInfinity or value is PositiveInfinity: 
      is_closed = False 
     return tuple.__new__(cls, (value, is_closed)) 

    def __init__(self, value, is_closed): 
     """ 
     See __new__ 
     """ 
     super(Bound, self).__init__((value, is_closed)) 

初期化しようと、それはobject.__init__() takes no parametersで失敗した場合。 super(Bound, self).__init__(…)は、のメソッドobjectにアクセスしているようですが、これは間違っているようです - superはオブジェクト__mro__にちょうど進みますか?物事を絞り込むために

、私は次のような構成に書いた:この例では

class T(tuple): 
    def __new__(cls, arg): 
     return super(T, cls).__new__(cls, arg) 

    def __init__(self, arg): 
     return super(T, self).__init__(arg) 

を、私は同じエラーを取得:T([])にもかかわらず、私をobject.__init__() takes no parameters伝えます。

T.__mro__(__main__.T, tuple, object)であるため、これは本質的に混乱します。明示的に型とインスタンスを記述することなく、super()を使用するとまったく同じことが起こります。

何が問題になるのですか? tupleは独自の__init__を持っていないため

答えて

4

It appears that super(Bound, self).__init__(…) accesses the __init__ method of object , which seems wrong – doesn't super just advance at the objects __mro__ ?

object.__init__は、MROの次__init__です。

Python 2では、(デフォルトでは抑制されている)警告が表示されます。 Python 3では、エラーです。 __init__メソッド(object.__init__の特別な処理により、object.__init__が不平を言わなくなります)を削除するか、または引数なしでsuper(Bound, self).__init__()を呼び出すことができます。

詳細については、Pythonのソースコードのexplanatory commentを参照してください。