2013-02-07 12 views
6

Stavo leggendo posta How can I assign a new class attribute via __dict__ in python? e non v'è stato un solo commento da @bruno desthuilliers dicendo:setattr (oggetto, nome, valore) vs oggetto .__ setattr __ (nome, valore)

Non si dovrebbe chiamare direttamente la magia metodi - sono qui come implementazione di operatori o funzioni generiche. In questo caso, la soluzione idiomatica è utilizzare setattr(obj, name, value).

Il caso di setattr sembra al di fuori della portata del suo commento: non un operatore, nemmeno un'implementazione di funzione generica.

Qualcuno può spiegare il commento? Perché dovrei preferire uno rispetto all'altro?

In tal caso è preferibile utilizzare obj.__setattr__(name, value)?

risposta

15

È consigliabile utilizzare sempre setattr(), il commentatore è corretto.

Non tutti i tipi implementano __setattr__, ad esempio, tuttavia setattr() funzionerà correttamente se il tipo consente di impostare l'attributo.

I metodi double-underscore sono hook, lì per consentire alle classi personalizzate di implementare il comportamento personalizzato. Le API Python useranno questi hook, se presenti, per tornare al comportamento predefinito se manca l'hook. Evitando l'API, ti stai caricando di dover implementare il fallback nel tuo codice.

È sempre e solo bisogno di chiamare __setattr__ direttamente quando si implementa una sottoclasse, e quindi preferibilmente attraverso la super() chiamata:

def Foo(Bar): 
    def __setattr__(self, attr, value): 
     # do something with attr and value 
     super(Foo, self).__setattr__(attr, value) 
+0

grazie @Martijn risposta grande –

Problemi correlati