2009-06-08 14 views
6

Supponiamo di avere una classe Python a cui voglio aggiungere una proprietà aggiuntiva.Patching classi in Python

C'è qualche differenza tra

import path.MyClass 
MyClass.foo = bar 

e usando qualcosa come:

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

?

In caso contrario, perché le persone sembrano fare il secondo anziché il primo? (Es. Qui http://concisionandconcinnity.blogspot.com/2008/10/chaining-monkey-patches-in-python.html) (. Con setattr è possibile utilizzare una variabile per il nome dell'attributo)

+1

Perché non aggiornare la definizione della classe con il metodo aggiuntivo? Perché tutto questo materiale "magico" quando puoi semplicemente modificare la definizione della classe? –

+0

Nel mio particolare problema quando ho chiesto questo, la classe proveniva da una libreria che non volevamo cambiare; e non potremmo sottoclassi. Sebbene sia d'accordo in generale. – interstar

risposta

11

Le dichiarazioni sono equivalenti, ma setattr potrebbero essere utilizzati perché è la scelta più dinamica dei due

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

+0

concordato. In particolare, ciò sarebbe richiesto dal modo in cui le patching sono state eseguite nel post di blog di riferimento dell'OP: il nome del metodo non era noto dalle viscere del metodo monkeypatch. –

+0

grazie. Ma ho aggiornato la domanda perché ancora non vedo che quella è più dinamica dell'altra – interstar

+0

ah ... no, capisco cosa intendi ... scusa .. doh! – interstar