2014-04-16 143 views
21

,我有以下的Python 2.7的代碼:Python的超級__init__繼承

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__()方法。 some_other_defined_stuff()),以及Frame設置的內容。需要先運行Frame.__init__()

我得到以下錯誤:

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

我不明白的邏輯原因。有人可以解釋嗎?我習慣於在ruby中輸入'super'。

+3

'Frame'必須擴展'object'。 'super'只適用於新式課程。 – That1Guy

回答

40

有兩種錯誤的位置:

  1. super()僅適用於new-style classes;使用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() 
+0

在Python> 3.X中引用'object'會是多餘的嗎? – gented

+0

@gented:是的,作爲基類的對象被隱含在Python 3中(因爲不再有舊式類)。 –

11

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() 
+0

有人認爲,這似乎很苛刻;只是因爲作者錯過了沒有被傳遞的「圖像」參數? –

+2

@MartijnPieters認真吧?反正修正。 – myusuf3

0

喜見我的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) 
+1

要改進此答案,請檢查您的格式併爲您的代碼提供解釋。 –