2015-09-28 15 views
8

Tôi có một hệ thống phân cấp hạng A < - B < - C, trong B, tôi cần một số chế biến trong các nhà xây dựng, vì vậy tôi đã đưa ra mã này từ bài đăng này: Understanding Python super() with __init__() methodsLỗi độ sâu đệ quy tối đa trong Python khi gọi init của siêu.

#!/usr/bin/python 

class A(object): 
    def __init__(self, v, v2): 
     self.v = v 
     self.v2 = v2 

class B(A): 
    def __init__(self, v, v2): 
     # Do some processing 
     super(self.__class__, self).__init__(v, v2) 

class C(B): 
    def hello(): 
     print v, v2 


b = B(3, 5) 
print b.v 
print b.v2 

c = C(1,2) 
print c 

Tuy nhiên, tôi có một lỗi thời gian chạy từ lần đệ quy tối đa vượt quá

File "evenmore.py", line 12, in __init__ 
    super(self.__class__, self).__init__(v, v2) 
RuntimeError: maximum recursion depth exceeded while calling a Python object 

Điều gì có thể sai?

+0

'super (B, self)'. – ekhumoro

+0

Hoặc nếu bạn có thể sử dụng Python 3, chỉ cần 'super()' (Python 3 điền vào các đối số tự động kỳ diệu). – ShadowRanger

Trả lời

6

Điều đầu tiên cần xem xét: C kế thừa hàm tạo từ B (vì nó không được xác định trong C).

Điều thứ hai cần cân nhắc: self.__class__ trong __init__ gọi trong lớp C là C, không B.

Hãy phân tích:

  • C().__init__ cuộc gọi super(self.__class__, self).__init__(v, v2) đó đã được giải quyết để super(C, self).__init__(v, v2) có nghĩa B.__init__(self, v, v2).
  • Đối số đầu tiên được chuyển đến B.__init__ có loại C. super(self.__class__, self).__init__(v, v2) lại được giải quyết thành B.__init__(self, v, v2).
  • Và một lần nữa, và một lần nữa, và một lần nữa. Và có sự đệ quy vô hạn của bạn.
1

Cung cấp tham số đầu tiên của siêu khi tên lớp giải quyết vấn đề này.

class B(A): 
    def __init__(self, v, v2): 
     # Do some processing 
     super(B, self).__init__(v, v2) 
+0

Phải rõ ràng lý do tại sao; 'self .__ class__' luôn là lớp bê tông, không phải là tên của lớp bạn đang học trong MRO. Trong thực tế, câu trả lời thứ hai trong bài viết bạn liên kết để đi vào chính xác điều này một cách chi tiết. –

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