2009-06-08 26 views
6

Supongamos que tengo una clase de Python a la que deseo agregar una propiedad adicional.Clases de parches en Python

¿Hay alguna diferencia entre

import path.MyClass 
MyClass.foo = bar 

y usar algo como:

import path.MyClass 
setattr(MyClass, 'foo', bar) 

?

Si no, ¿por qué la gente parece hacer la segunda en lugar de la primera? (. Por ejemplo, aquí http://concisionandconcinnity.blogspot.com/2008/10/chaining-monkey-patches-in-python.html) (. Con setattr puede utilizar una variable para el nombre del atributo)

+1

¿Por qué no actualizar la definición de su clase con el método adicional? ¿Por qué hacer todas estas cosas "mágicas" cuando simplemente puedes editar la definición de clase? –

+0

En mi problema particular cuando pregunté esto, la clase provenía de una biblioteca que no queríamos cambiar; y no podríamos subclasificarlo. Aunque estoy de acuerdo en general. – interstar

Respuesta

11

Los estados son equivalentes, pero setattr podrían utilizarse porque es la opción más dinámica de los dos

Ver: http://docs.python.org/library/functions.html#setattr

+0

De acuerdo. En particular, esto se requeriría de la forma en que se realizaba el parcheo en la entrada referida al blog de la OP, el nombre del método no era conocido por las entrañas del método monkeypatch. –

+0

gracias. Pero actualicé la pregunta porque todavía no veo que uno sea más dinámico que el otro – interstar

+0

ah ... no, ya veo lo que quieres decir ... lo siento ... ¡do! – interstar