2014-04-16 20 views
21

Tôi có Python 2,7 mã sau:Python siêu __init__ thừa kế

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

Tôi đang cố gắng để mở rộng phương pháp __init__() để khi tôi nhanh chóng một 'mắt' nó một loạt các công cụ khác (tự. some_other_defined_stuff()), ngoài những gì Frame thiết lập. Frame.__init__() cần chạy trước.

tôi nhận được lỗi sau:

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

Mà tôi không hiểu nguyên nhân logic của. Ai đó có thể giải thích được không? Tôi thường chỉ gõ 'siêu' trong ruby.

+3

'Khung' phải mở rộng' đối tượng'. 'super' sẽ chỉ hoạt động trên các lớp kiểu mới. – That1Guy

Trả lời

40

Có hai lỗi ở đây:

  1. super() chỉ hoạt động cho new-style classes; sử dụng object làm lớp cơ sở cho Frame để làm cho nó sử dụng ngữ nghĩa kiểu mới.

  2. Bạn vẫn cần gọi phương thức ghi đè với các đối số phù hợp; chuyển vào số image đến cuộc gọi __init__.

Vì vậy, các mã đúng sẽ là:

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

Tham chiếu đến 'đối tượng' có bị thừa trong Python> 3.X không? – gented

+0

@gented: yes, 'object' như là một lớp cơ sở được ngụ ý trong Python 3 (vì không còn các lớp kiểu cũ nữa). –

11

Frame phải mở rộng object bởi vì chỉ có các lớp học kiểu mới hỗ trợ super gọi bạn thực hiện trong Eye như vậy:

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

Hrm, downvoting điều này có vẻ khắc nghiệt; chỉ vì tác giả bỏ qua đối số 'hình ảnh' không được truyền? –

+2

@MartijnPieters nghiêm túc hả? cố định anyways. – myusuf3

0

Hi thấy mã hoạt động của tôi cho 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

Để cải thiện câu trả lời này, vui lòng kiểm tra định dạng của bạn và cung cấp giải thích cho mã của bạn. –

Các vấn đề liên quan