I have the following Python 2.7 code:
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()
I'm trying to extend the __init__()
method so that when I instantiate an 'Eye' it does a bunch of other stuff (self.some_other_defined_stuff()), in addition to what Frame sets up. Frame.__init__()
needs to run first.
I get the following error:
super(Eye, self).__init__()
TypeError: must be type, not classobj
Which I do not understand the logical cause of. Can someone explain please? I'm used to just typing 'super' in ruby.
There are two errors here:
super()
only works for new-style classes; useobject
as a base class forFrame
to make it use new-style semantics.You still need to call the overridden method with the right arguments; pass in
image
to the__init__
call.
So the correct code would be:
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
must extend object
because only the new style classes support super
call you make in Eye
like so:
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()
Please write :__metaclass__ = type
at the top of the code then we can Access super class
__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()
Hi see my working codes for python 2.7
__metaclass__ = type
class Person:
def __init__(self, first, last, age):
self.firstname = first
self.lastname = last
self.age = age
def __str__(self):
return self.firstname + " " + self.lastname + ", " + str(self.age)
class Employee(Person):
def __init__(self, first, last, age, staffnum):
super(Employee, self).__init__(first, last, age)
self.staffnumber = staffnum
def __str__(self):
return super(Employee, self).__str__() + ", " + self.staffnumber
x = Person("Marge", "Simpson", 36)
y = Employee("Homer", "Simpson", 28, "1007")
print(x)
print(y)
来源:https://stackoverflow.com/questions/23117717/python-2-x-super-init-inheritance-doesnt-work-when-parent-doesnt-inherit-f