Я написал программное обеспечение со значительными перегрузками, и в последнее время я сожалею об этой политике. Я бы сказал так:
Только операторы перегрузки, если это естественная, ожидаемая вещь, которая не имеет побочных эффектов.
Поэтому, если вы создаете новый класс RomanNumeral
, имеет смысл перегружать сложение и вычитание и т. Д. Но не перегружайте его, если это не естественно: нет смысла определять сложение и вычитание для Car
или Vehicle
объект.
Еще одно практическое правило: не перегружайте ==
. Это делает очень трудным (хотя и не невозможным) тестирование на предмет совпадения двух объектов. Я сделал эту ошибку и долго платил за нее.
Что касается времени перегрузки +=
, ++
и т. Д., Я бы на самом деле сказал: перегрузка дополнительных операторов возможна только в том случае, если у вас много спроса на эту функциональность. Проще иметь один способ сделать что-то, чем пять. Конечно, это означает, что иногда вам придется писать x = x + 1
вместо x += 1
, но больше кода в порядке, если он понятнее.
В целом, как и во многих «причудливых» функциях, легко подумать, что вы чего-то хотите, когда вы на самом деле этого не делаете, реализовывать кучу вещей, не замечать побочных эффектов, а потом выяснить это позже. Ошибка на консервативной стороне.
РЕДАКТИРОВАТЬ: Я хотел добавить пояснительную записку о перегрузке ==
, потому что, кажется, различные комментаторы неправильно понимают это, и это застало меня врасплох. Да, is
существует, но это другая операция. Скажем, у меня есть объект x
, который либо из моего пользовательского класса, либо является целым числом. Я хочу посмотреть, если x
- это число 500. Но если вы установите x = 500
, а затем протестируйте x is 500
, вы получите False
из-за того, как Python кэширует числа. С 50
он вернул бы True
. Но вы не можете использовать is
, потому что вы можете захотеть, чтобы x == 500
вернул True
, если x
является экземпляром вашего класса. Смешение? Определенно. Но это та деталь, которую вам нужно понять, чтобы успешно перегрузить операторы.