web-dev-qa-db-ja.com

Python 2.x super __init__継承は、親がオブジェクトから継承しないと機能しません

私は次のPython 2.7コードを持っています:

_class Frame:
    def __init__(self, image):
        self.image = image

class Eye(Frame):
    def __init__(self, image):
        super(Eye, self).__init__()
        self.some_other_defined_stuff()
_

__init__()メソッドを拡張して、 'Eye'をインスタンス化するときに、Frameが設定するものに加えて、他のもの(self.some_other_defined_stuff())の束を作成しようとしています。 Frame.__init__()を最初に実行する必要があります。

次のエラーが表示されます。

_super(Eye, self).__init__()
TypeError: must be type, not classobj
_

私は論理的な原因を理解していません。誰か説明してもらえますか? Rubyで「スーパー」と入力するのに慣れています。

25
cjm2671

ここには2つのエラーがあります。

  1. super()は、 新しいスタイルのクラス ;でのみ機能します。 objectの基本クラスとしてFrameを使用して、新しいスタイルのセマンティクスを使用するようにします。

  2. オーバーライドされたメソッドを正しい引数で呼び出す必要があります。 image__init__呼び出しに渡します。

したがって、正しいコードは次のようになります。

class Frame(object):
    def __init__(self, image):
        self.image = image

class Eye(Frame):
    def __init__(self, image):
        super(Eye, self).__init__(image)
        self.some_other_defined_stuff()
46
Martijn Pieters

Frameは、objectを拡張する必要があります。これは、新しいスタイルクラスのみがsuperで行うEye呼び出しをサポートするためです。

class Frame(object):
    def __init__(self, image):
        self.image = image

class Eye(Frame):
    def __init__(self, image):
        super(Eye, self).__init__(image)
        self.some_other_defined_stuff()
12
myusuf3

書いてください :__metaclass__ = typeコードの先頭で、スーパークラスにアクセスできます

__metaclass__ = type
class Vehicle:
                def start(self):
                                print("Starting engine")
                def stop(self):
                                print("Stopping engine")                            
class TwoWheeler(Vehicle):
                def say(self):
                    super(TwoWheeler,self).start()
                    print("I have two wheels")
                    super(TwoWheeler,self).stop()                            
Pulsar=TwoWheeler()
Pulsar.say()
0
ashwin r