2017-01-17 9 views
2

にスーパーコンストラクタを呼び出すために、私が見てきた標準コードは次のとおりです。Aより良い方法はPython 2.7で親クラスのコンストラクタを呼び出すにはPython 2.7

super(Child, self).__init__(self, val)

Childがどこにありますか子クラス。 Python 3.xでは、これは単純化されていますが、今は2.7を使用する必要があります。私の質問は、Python 2.7でsuperの "標準的な"使用が良いとは思いません:

super(self.__class__, self).__init__(self, val)

これをテストしたところ、うまくいきました。このアプローチを使用しない理由はありますか?

+3

from builtins import super # from Python-Future class Parent(object): def __init__(self): print('Hello') class Child(Parent): def __init__(self): super().__init__() Child() 

出力:それはではPython 2でのPython 3 super()を使用することができます。 –

+1

'self .__ class__'を渡すのと同じくらい単純だった場合、' super'は最初にその引数を要求するようには設計されていませんでした。 – user2357112

+0

あなたは、最初に意図したクラスではなく、チェーンの次のクラスを参照します。いい視点ね。 – PProteus

答えて

3

、これは単純化されているが、私は今の2.7を使用する必要があります。

Python 2.7でスーパーコンストラクタを呼び出すより良い方法は、Python-Futureを使用しています。あなたのクラスから継承したときに何が起こるかを確認してください

Hello 
+0

これは素晴らしいです、ありがとう! – PProteus

+0

それは助けてよかった。あなたの問題が解決されたら、回答を受け入れることができます(http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 –

+0

ブリー。それは確かに便利だが、[魔法の背後にあるコード](https://github.com/PythonCharmers/python-future/blob/fe494df5d66db19af94a1fdc32afe0e2e52dcf66/src/future/builtins/newsuper.py)を見て、それは本当に遅く見え、あなたが '__hash__ = Parent____ hash__'のようなことをすれば、このメソッドはMRO内のあるクラスのdictにしか存在しないと仮定しているので、奇妙な失敗に陥る可能性があります。 – user2357112

2

この構成では、クラスがサブクラス化されたときにRecursionErrorが発生します。

MCVE:Pythonの3.xでは

class A(object): 
    def __init__(self): 
     super(self.__class__, self).__init__() 


class B(A): 
    pass 

B() 
関連する問題