Tôi đã viết phần mềm với số lượng đáng kể quá tải và gần đây tôi rất tiếc chính sách đó. Tôi sẽ nói điều này:
Chỉ các nhà khai thác quá tải nếu đó là điều tự nhiên, dự kiến sẽ làm và không có bất kỳ tác dụng phụ nào.
Vì vậy, nếu bạn thực hiện một lớp mới RomanNumeral
, nó làm cho tinh thần để quá tải cộng và trừ vv Nhưng không quá tải nó trừ khi nó là điều tự nhiên: nó làm cho không có ý nghĩa để xác định cộng và trừ cho một Car
hoặc một đối tượng Vehicle
.
Quy tắc chung khác: không quá tải ==
. Nó làm cho nó rất khó (mặc dù không phải là không thể) để thực sự kiểm tra nếu hai đối tượng là như nhau. Tôi đã phạm sai lầm này và trả tiền cho nó trong một thời gian dài.
Đối với khi quá tải +=
, ++
vv, tôi thực sự nói: chỉ quá tải các toán tử bổ sung nếu bạn có rất nhiều nhu cầu cho chức năng đó. Thật dễ dàng để có một cách để làm điều gì đó hơn năm. Chắc chắn, nó có nghĩa là đôi khi bạn sẽ phải viết x = x + 1
thay vì x += 1
, nhưng nhiều mã hơn là ok nếu nó rõ ràng hơn. Nói chung, giống như với nhiều tính năng 'ưa thích', thật dễ dàng để nghĩ rằng bạn muốn một cái gì đó khi bạn không thực sự, thực hiện một loạt các công cụ, không nhận thấy các tác dụng phụ, và sau đó con số nó ra sau đó. Err ở phe bảo thủ.
EDIT: Tôi muốn thêm ghi chú giải thích về quá tải ==
, bởi vì có vẻ như nhiều người nhận xét khác hiểu nhầm điều này và nó đã khiến tôi hiểu. Có, is
tồn tại, nhưng đó là một hoạt động khác. Giả sử tôi có một đối tượng x
, là từ lớp tùy chỉnh của tôi hoặc là số nguyên. Tôi muốn xem nếu x
là số 500. Nhưng nếu bạn đặt x = 500
, sau đó kiểm tra x is 500
, bạn sẽ nhận được False
, do cách Python lưu trữ số. Với 50
, nó sẽ trả về True
. Nhưng bạn không thể sử dụng is
, vì bạn có thể muốn x == 500
trả lại True
nếu x
là một phiên bản của lớp học của bạn. Gây nhầm lẫn? Chắc chắn rồi. Nhưng đây là loại chi tiết bạn cần phải hiểu cho các nhà khai thác quá tải thành công.
BTW, cho những người tuyệt vọng tại nghĩ rằng không có% để định dạng chuỗi: mặc dù tài liệu Python 3 mô tả% là lỗi thời, nó vẫn được ghi lại và dường như không có tính năng nào thực sự biến mất cho đến Python 4, dựa trên các cuộc thảo luận gần đây trong python-dev. Điều đó để lại rất nhiều thời gian để tìm hiểu và yêu thích phương thức định dạng chuỗi mới đã có sẵn trong 2.6. –
Chức năng định dạng tốt hơn nhiều so với% – Casebash