2010-03-11 8 views
24

¿Hay alguna manera de hacer que una función de clase no pueda ser revertida? algo así como la palabra clave final de java. es decir, cualquier clase superior no puede anular ese método.Cómo evitar que se anule una función en python

+3

Ni siquiera tiene métodos * privados * en Python, los miembros '__xxx' solo se sombrean. Realmente me sorprendería si hubiera algo como una palabra clave 'final'. – Boldewyn

+0

¿Por qué? ¿Cuál es el caso de uso para prevenir esto? La gente puede leer tu fuente y reescribir la función. ¿Que estás tratando de hacer? –

+0

No sé por qué todos ustedes presumen que lo quiero para evitar que alguien else lo sobrescriba - Quiero que me evite accidentalmente anulándolo en el futuro. Suponiendo que tengo un árbol de herencia relativamente profundo, y una de las clases "más profundas" redefinirá accidentalmente el func (olvidándolo incluso existe) – olamundo

Respuesta

31

El problema es que estás tratando de escribir en Python usando filosofías Java. Algo se lleva, pero no todos. En Python puede hacer lo siguiente y está perfectamente bien, pero va completamente en contra de la forma en que Java piensa en los objetos.

class Thing(object): 
    x = 1 
something = Thing() 
something.y = something.x 

Si realmente lo desea, puede probar el code posted here. Pero como puede ver, hay un montón de código allí para que haga lo que quiere. También se debe tener en cuenta que incluso la persona que publicó el código dice que se puede pasar usando __dict__ o object.__setattr__.

+4

-1 Tal código merece el Premio Maginot Memorial para mecanismos de defensa inútil. –

+17

¿Por qué el -1? No escribí el código al que me vinculé y no alenté su uso. Lo encontré con una búsqueda en Google y pensé que ayudó a probar mi punto de que tratar de hacer cumplir la final no es una buena idea en Python. – unholysampler

+1

Para incluso vincularlo. –

70

Se puede poner un comentario en el que hay al efecto de:

# We'll fire you if you override this method. 

Es sorprendente lo bien que soluciones de baja tecnología como esto en la práctica.

+2

+1 Y si esto se descubrió a partir de un informe de error del usuario, vamos a despedir a los wallies que no probaron la aplicación correctamente. –

+4

Esto debería ser parte de las cadenas de documentación (es decir, especificación API) en lugar de un comentario – vog

0

Sí, no lo hagas.

Debo añadir a esto después del voto abajo. Dichos mecanismos de protección son vistos por algunos como contrapuestos al ethos de Python: "aquí todos consentimos adultos". ¿De quién quiere proteger tales funciones? Y si un comentario no es suficiente, ¿por qué algo 'más fuerte'?

Documentaré sus expectativas y espero que otros programadores actúen con responsabilidad.

Cuestiones relacionadas