Trong python 2.x, siêu chấp nhận các trường hợp sauTại sao python super không chỉ chấp nhận cá thể?
class super(object)
| super(type) -> unbound super object
| super(type, obj) -> bound super object; requires isinstance(obj, type)
| super(type, type2) -> bound super object; requires issubclass(type2, type)
| Typical use to call a cooperative superclass method:
như xa như tôi thấy, siêu là một lớp, gói các loại và (cuối cùng) các trường hợp để giải quyết các lớp cha của một lớp.
tôi khá bối rối bởi một vài điều:
- tại sao đó cũng là không
super(instance)
, với việc sử dụng điển hình ví dụsuper(self).__init__()
. Về mặt kỹ thuật, bạn có thể lấy kiểu của một đối tượng từ chính đối tượng đó, vì vậy chiến lược hiện tạisuper(ClassType, self).__init__()
là loại dự phòng. Tôi cho rằng các vấn đề tương thích với các lớp kiểu cũ hoặc nhiều thừa kế, nhưng tôi muốn nghe ý kiến của bạn. - tại sao, mặt khác, python 3 sẽ chấp nhận (xem Understanding Python super() with __init__() methods)
super().__init__()
? Tôi thấy loại ma thuật trong điều này, vi phạm rõ ràng là tốt hơn so với Zen tiềm ẩn. Tôi đã thấy thích hợp hơnself.super().__init__()
.
Tôi đoán bạn có nghĩa là lớp B (A): và lớp C (B): –
Tuy nhiên, bạn đã đúng. Nó sẽ không bao giờ có thể gọi A .__ init __() từ B, bởi vì trong phương pháp B .__ init __() tự sẽ thuộc loại C, có siêu trực tiếp là B, không A. Vì vậy, B .__ init __() sẽ được gọi lại. –
ah bạn đúng về lỗi đánh máy, cảm ơn! Và điều này thậm chí còn phức tạp hơn trong nhiều kế hoạch thừa kế, tôi nghĩ rằng tôi có thể tìm thấy một liên kết về điều đó. – u0b34a0f6ae