2009-08-11 31 views

Trả lời

8

Cuốn sách Expert Python Programming đã thảo luận về chủ đề "những cạm bẫy siêu" trong chương 3. Điều đáng đọc. Dưới đây là kết luận của cuốn sách:

Siêu sử dụng phải nhất quán: Trong phân cấp lớp, siêu nên được sử dụng ở khắp mọi nơi hoặc hư không. Trộn các cuộc gọi siêu và cổ điển là một thực tế khó hiểu. Mọi người có xu hướng tránh siêu, vì mã của họ rõ ràng hơn.

Chỉnh sửa: Hôm nay tôi đọc phần này của cuốn sách một lần nữa. Tôi sẽ sao chép một số câu khác, vì việc sử dụng siêu là khó khăn:

  • Tránh thừa kế nhiều lần trong mã của bạn.
  • Nhất quán với cách sử dụng và không pha trộn kiểu mới và kiểu cũ.
  • Kiểm tra cấu trúc phân cấp lớp trước khi gọi phương thức của nó trong lớp con của bạn.
1

Có, chỉ cần gắn các đối số từ khóa trong các phương thức __init__ của bạn và bạn không nên có quá nhiều vấn đề.

Tôi đồng ý rằng nó dễ vỡ, nhưng không kém hơn so với sử dụng tên của lớp được kế thừa.

5

Bạn có thể sử dụng siêu, nhưng như bài viết cho biết, có những hạn chế. Miễn là bạn biết chúng, không có vấn đề với việc sử dụng tính năng này. Nó giống như mọi người nói "sử dụng thành phần, không thừa kế" hoặc "không bao giờ sử dụng các biến toàn cục". Nếu tính năng tồn tại, có một lý do. Chỉ cần chắc chắn để hiểu lý do tại sao và những gì và sử dụng chúng một cách khôn ngoan.

+12

* "Nếu tính năng tồn tại, có lý do." * Đối số này đơn giản là không đúng sự thật. Nhiều ngôn ngữ có các tính năng không nên được sử dụng bởi bất kỳ ai. –

2

Tôi thích super() hơn vì nó cho phép bạn thay đổi lớp kế thừa (ví dụ khi bạn đang tái cấu trúc và thêm lớp trung gian) mà không thay đổi nó trên tất cả các phương pháp.

+2

trừ khi bạn không sử dụng python 3 (phần lớn là sử dụng python) – nosklo

+1

Ý của bạn là gì? super() cũng nằm trên Python 2. – juanjux

+0

Nó được backported tôi tin. –

3

Sự cố mọi người gặp phải với super là vấn đề về đa kế thừa. Vì vậy, nó là một chút không công bằng để đổ lỗi cho super. Nếu không có super nhiều thừa kế thậm chí còn tồi tệ hơn. Michele Simionato độc đáo bọc này lên trong blog article mình trên siêu:

Mặt khác, người ta có thể tự hỏi, nếu tất cả các mụn cóc siêu không phải là gợi ý của một số vấn đề nghiêm trọng tiềm ẩn. Nó có thể cũng được rằng vấn đề không phải là với siêu, cũng không phải với phương pháp hợp tác: vấn đề có thể với nhiều kế thừa chính nó.

Vì vậy, bài học chính là bạn nên cố gắng tránh đa thừa kế.

Vì lợi ích của tính nhất quán, tôi luôn sử dụng siêu, ngay cả khi thừa kế đơn lẻ không thực sự quan trọng (ngoài lợi thế nhỏ của việc không biết tên lớp cha). Trong Python 3+ super là thuận tiện hơn, vì vậy có một chắc chắn nên sử dụng siêu.

2

super() cố gắng giải quyết cho bạn vấn đề đa thừa kế; thật khó để nhân rộng ngữ nghĩa của nó và bạn chắc chắn không nên tạo ra bất kỳ ngữ nghĩa mới nào trừ khi bạn hoàn toàn chắc chắn.

Đối với thừa kế duy nhất, có thực sự không có sự khác biệt giữa

class X(Y): 
    def func(self): 
     Y.func(self) 

class X(Y): 
    def func(self): 
     super().func() 

vì vậy tôi đoán rằng chỉ là vấn đề sở thích.

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