Я написал программное обеспечение со значительными перегрузками и в последнее время сожалею об этой политике. Я бы сказал так:
Только операторы перегрузки, если это естественное, ожидаемое действие и не имеет побочных эффектов.
Поэтому, если вы создаете новый класс 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
является экземпляром вашего класса. Сбивает с толку? Определенно. Но это то, что вам нужно знать, чтобы успешно перегрузить операторы.
person
Peter
schedule
12.10.2009