2010-11-20 32 views
25

tôi có mã như thế này:Làm thế nào để tránh đệ quy vô hạn với siêu()?

class A(object): 
    def __init__(self): 
      self.a = 1 

class B(A): 
    def __init__(self): 
     self.b = 2 
     super(self.__class__, self).__init__() 

class C(B): 
    def __init__(self): 
     self.c = 3 
     super(self.__class__, self).__init__() 

Instantiating B làm việc như mong đợi nhưng instantiating C recursed vô hạn và gây ra một chồng tràn. Làm sao tôi có thể giải quyết việc này?

Trả lời

46

Khi instantiating C gọi B.__init__, self.__class__ vẫn sẽ là C, vì vậy siêu() gọi mang lại cho B.

Khi gọi super(), sử dụng tên lớp trực tiếp. Vì vậy, trong B, hãy gọi super(B, self), thay vì super(self.__class__, self) (và để có biện pháp tốt, hãy sử dụng super(C, self) trong C). Từ Python 3, bạn chỉ có thể sử dụng siêu() mà không có đối số để đạt được cùng một điều

+0

Trước hết ... gọi init với siêu là một vấn đề lớn mà internet đã quyết định phải tồn tại. Nó hoạt động mà Thomas đang mô tả ... tuy nhiên, tại sao bạn lại chạy siêu với init? Đó không phải là mục đích của nó. (Damn OK là mặc định cho nhập)

Chỉ cần suy nghĩ về điều này ... khi bạn siêu init ... bạn gọi các lớp cơ sở init, có thể ghi đè tất cả các công việc bạn đã làm. Nếu bạn nhấn mạnh vào sử dụng siêu với init, làm điều đó một cách chính xác. –

+0

Giáo sư Ebral, hãy cho chúng tôi biết cách sử dụng đúng cách nếu chúng tôi phải làm như vậy. – nmz787

+0

@ nmz787: gọi siêu nên được thực hiện trước khi thực hiện khởi tạo cục bộ, các câu hỏi sẽ làm theo cách khác xung quanh ... Vâng! Tôi có lẽ nên chỉnh sửa câu hỏi vì đó là thực hành không tốt và không nên để lại làm ví dụ. – kriss

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