私は次の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で「スーパー」と入力するのに慣れています。
ここには2つのエラーがあります。
super()
は、 新しいスタイルのクラス ;でのみ機能します。 object
の基本クラスとしてFrame
を使用して、新しいスタイルのセマンティクスを使用するようにします。
オーバーライドされたメソッドを正しい引数で呼び出す必要があります。 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()
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()
書いてください :__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()