Vì vậy, tôi đã theo dõi Siêu được coi là có hại của Python và đi kiểm tra các ví dụ của anh ấy.
Tuy nhiên, Ví dụ 1-3 , được cho là hiển thị cách gọi chính xác superkhi xử lý __init__các phương thức mong đợi các đối số khác nhau, tính năng căn hộ không hoạt động.
Đây là những gì tôi nhận được:
~ $ python example1-3.py
MRO: ['E', 'C', 'A', 'D', 'B', 'object']
E arg= 10
C arg= 10
A
D arg= 10
B
Traceback (most recent call last):
File "Download/example1-3.py", line 27, in <module>
E(arg=10)
File "Download/example1-3.py", line 24, in __init__
super(E, self).__init__(arg, *args, **kwargs)
File "Download/example1-3.py", line 14, in __init__
super(C, self).__init__(arg, *args, **kwargs)
File "Download/example1-3.py", line 4, in __init__
super(A, self).__init__(*args, **kwargs)
File "Download/example1-3.py", line 19, in __init__
super(D, self).__init__(arg, *args, **kwargs)
File "Download/example1-3.py", line 9, in __init__
super(B, self).__init__(*args, **kwargs)
TypeError: object.__init__() takes no parameters
Có vẻ như objectbản thân nó đã vi phạm một trong những phương pháp hay nhất được đề cập trong tài liệu, đó là các phương pháp sử dụng superphải chấp nhận *argsvà **kwargs.
Bây giờ, rõ ràng ngài Knight đã mong đợi các ví dụ của mình hoạt động, vậy đây có phải là thứ đã được thay đổi trong các phiên bản Python gần đây không? Tôi đã kiểm tra 2.6 và 2.7, và nó không thành công trên cả hai.
Vậy đâu là cách chính xác để giải quyết vấn đề này?
object, và nó làm cho chắc chắn để gọi objectlà __init__chính xác.
__init__trên objectâm thầm bỏ qua bất kỳ tham số nào trên Python 2.5. Điều này đã thay đổi trong Python 2.6.