2012-03-23 39 views
18

Tôi hơi bối rối về cách đối số được chuyển giữa các lớp con và lớp con trong Python. Hãy xem xét cấu trúc lớp học sau:Phân lớp - Các đối số từ siêu lớp

class Superclass(object): 
    def __init__(self, arg1, arg2, arg3): 
     #Inilitize some variables 
     #Call some methods 

class Subclass(Superclass): 
    def __init__(self): 
     super(Subclass, self).__init__() 
     #Call a subclass only method 

Tôi gặp khó khăn khi hiểu cách đối số được chuyển giữa Superclass và lớp con. Có cần phải liệt kê lại tất cả các đối số Superclass trong bộ khởi tạo lớp con? Trường hợp mới, chỉ lớp con, đối số được chỉ định? Khi tôi cố gắng sử dụng đoạn mã trên để khởi tạo một lớp con, nó chỉ mong đợi 1 đối số, không phải là số nguyên gốc 4 (bao gồm cả tự) mà tôi liệt kê.

TypeError: __init__() takes exactly 1 argument (4 given) 
+1

Lưu ý rằng 'lấy chính xác 1 đối số' có thể gây nhầm lẫn, vì đối số đó là' tự' (được tự động chuyển). – katrielalex

Trả lời

17

Không có phép thuật nào xảy ra! Các phương thức __init__ hoạt động giống như tất cả các phương thức khác. Bạn cần phải rõ ràng lấy tất cả các đối số bạn cần trong bộ khởi tạo lớp con và chuyển chúng qua lớp cha.

class Superclass(object): 
    def __init__(self, arg1, arg2, arg3): 
     #Initialise some variables 
     #Call some methods 

class Subclass(Superclass): 
    def __init__(self, subclass_arg1, *args, **kwargs): 
     super(Subclass, self).__init__(*args, **kwargs) 
     #Call a subclass only method 

Khi bạn gọi Subclass(arg1, arg2, arg3) Python sẽ chỉ gọi Subclass.__init__(<the instance>, arg1, arg2, arg3). Nó sẽ không kỳ diệu cố gắng để phù hợp với một số các đối số cho các siêu lớp và một số lớp con.

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