2011-02-10 19 views
5

La clase base tiene esta:Python: cómo reemplazar una propiedad con un atributo regular?

def _management_form(self): 
    # code here 
    return form 
management_form = property(_management_form) 

En mi clase derivada, estoy tratando de escribir esto:

self.management_form = self.myfunc() 

Pero por supuesto que no funciona. Me dice "no puedo establecer atributo" porque esa propiedad no tiene setter. Pero no quiero configurarlo, quiero redefinir lo que significa "managent_form". Intenté poner del self.managent_form primero, pero eso tampoco funcionó. Entonces, ¿cómo puedo desprovecharlo?

+0

¿Estás seguro de que es una buena idea? Suena como romper la relación is-a ... – delnan

+0

Bueno, como se define la propiedad, reconstruye el objeto cada vez que lo usas, lo cual es simplemente estúpido. Puse una declaración de impresión allí, y se llama como 10 veces, y está causando problemas porque necesito modificar algunas de sus propiedades, pero es inútil si va a ser reemplazada la próxima vez que se use. No tengo idea de por qué ellos (los desarrolladores de Django) lo hicieron así. Básicamente, solo quiero que se construya una vez y luego devolver esa instancia a partir de ese momento. – mpen

Respuesta

6

podría asignar a la clase, en lugar de la instancia:

MyClass.management_form = property(self.myfunc) 

Por supuesto, esto cambia la clase misma para todas las instancias (incluso los preexistentes). Si esto está bien, también puede llamarlo exactamente una vez, en lugar de en cada constructor de clase derivada (que supongo que es lo que está haciendo ahora).

De lo contrario, puede anularla en la clase derivada de la forma habitual:

class MyOtherClass(MyClass): 
    def _new_mf(self): 
     # Better code 
     return form 
    management_form = property(new_mf) 
+1

Supongo que anularlo para simplemente devolver la propiedad es lo suficientemente bueno ... aunque es un tanto extraño que puedas desmantelarlo. Todo lo demás en Python es completamente mutable. – mpen

Cuestiones relacionadas