2016-04-29 18 views
0

This Python 2 exampleなぜPython 2の `super`は明示的なクラス引数と自己引数を必要としますか?

class LoggingDict(dict): 
    # Simple example of extending a builtin class 
    def __setitem__(self, key, value): 
     logging.info('Setting %r to %r' % (key, value)) 
     super(LoggingDict, self).__setitem__(key, value) 

this Python 3 example

class LoggingDict(dict): 
    # Simple example of extending a builtin class 
    def __setitem__(self, key, value): 
     logging.info('Setting %r to %r' % (key, value)) 
     super().__setitem__(key, value) 

は、Python 2のsuperは、明示的なクラスとself引数(ただし、Pythonの3のdoesntのを)必要とするという事実を示しています。何故ですか?それは刺激的な限界のようです。

+1

あなたはここでそれを見つけることができるかもしれません - [なぜPython 3.xのsuper()魔法ですか?](http://stackoverflow.com/questions/19608134/why-is-python-3-xs-スーパーマジック) – AKS

+0

これは、質問にはあまり答えないが、噛みつくための役に立つ文脈を提供している。座って考えて、答えが出てくるかもしれない。 – Brendan

+0

実際、「コンパイル時の魔法」が実行されていることと、「スーパー(自己.__クラス__...)」が「バッド」であるという事実にも言及しています。考えましょう! – Brendan

答えて

0

AKS」コメント内のリンクは、ここで答えを提供します。

は、Python 2の例で言うことができます私はその明示的なクラス参照好きではない」と思った私は、クラスの名前や動きを変更するどのような場合。このコードは更新するのを忘れていますか? " 、私はself.__class__で明示的なクラス名を置き換えるだろうと書いた-ヘクタール、私が考えたとしましょう:それをインスタンス化し、

class LoggingDict(dict): 
    # Simple example of extending a builtin class 
    def __setitem__(self, key, value): 
     logging.info('Setting %r to %r' % (key, value)) 
     super(self.__class__, self).__setitem__(key, value) 

を今、私は(__setitem__を上書きしません)LoggingDictSpecialisedLoggingDictと呼ばれるサブクラスを作成し、それに__setitem__を呼び出してください。今

selfSpecialisedLoggingDictのインスタンスを参照し、そのsuper戻りLoggingDict、私たちは無限再帰に入る、背筋LoggingDict.__setitem__に行きます。

重要なことは、のPython 2では、定義されたクラスが実際にはわからないということです。と呼ばれるインスタンスのクラスしか知りません。 Python 3 does compile-time "magic"__class__セルを関数に追加して、明示的なクラス参照なしでsuper()を使用することができます。

関連する問題