He escrito software con grandes cantidades de sobrecarga, y últimamente lamento esa política. Quiero decir lo siguiente:
operadores de sobrecarga Sólo si es lo natural, que se espera que hacer y no tiene ningún efecto secundario.
Así que si usted hace una nueva clase RomanNumeral
, tiene sentido sobrecargar la suma y resta etc, pero no sobrecargue a menos que sea natural: no tiene sentido definir la suma y resta para un Car
o un objeto Vehicle
.
Otra regla de oro: no sobrecargar ==
. Hace que sea muy difícil (aunque no imposible) probar realmente si dos objetos son iguales. Cometí este error y pagué durante mucho tiempo.
En cuanto a cuándo sobrecargar +=
, ++
etc., realmente diría: solo sobrecargue los operadores adicionales si tiene mucha demanda para esa funcionalidad. Es más fácil tener una forma de hacer algo que cinco. Claro, significa que a veces tendrás que escribir x = x + 1
en lugar de x += 1
, pero hay más códigos correctos si está claro.
En general, al igual que con muchas características 'fantasiosas', es fácil pensar que quiere algo cuando realmente no, implementar un montón de cosas, no notar los efectos secundarios, y luego descubrirlo más tarde. Err en el lado conservador.
EDIT: Quería añadir una nota explicativa sobre la sobrecarga de ==
, porque parece que varios comentaristas lo malinterpretan y me ha sorprendido. Sí, is
existe, pero es una operación diferente. Supongamos que tengo un objeto x
, que es de mi clase personalizada o es un número entero. Quiero ver si x
es el número 500. Pero si configura x = 500
, luego pruebe x is 500
, obtendrá False
, debido a la forma en que Python almacena los números en caché. Con 50
, devolvería True
. Pero no puede usar is
, porque es posible que desee x == 500
para devolver True
si x
es una instancia de su clase. ¿Confuso? Seguro. Pero este es el tipo de detalle que necesita comprender para sobrecargar exitosamente a los operadores.
BTW, para aquellos desesperados en el pensamiento de no tener% para el formato de cadena: aunque la documentación de Python 3 describe% como obsoleto, todavía está documentado y parece que no hay posibilidades de que la característica realmente desaparezca hasta Python 4, según las discusiones recientes en python-dev. Eso deja mucho tiempo para aprender y amar el nuevo método de formato de cadena ya disponible en 2.6. –
La función de formato es mucho mejor que% alguna vez – Casebash