2011-09-26 17 views
7

So che non è possibile chiamare object.__setattr__ su oggetti non ereditati da object, ma c'è qualcos'altro che è diverso tra i due? Sto lavorando in Python 2.6, se questo è importante.Qual è la differenza tra setattr() e oggetto .__ setattr __()?

+0

'setattr' è qualcosa che si chiama su un altro oggetto,' __setattr __() 'è qualcosa che si implementa sul proprio oggetto. –

+1

'setattr (obj, attr, value)' chiama semplicemente 'obj .__ setattr __ (attr, value)', almeno per le classi di nuovo stile. – agf

risposta

12

setattr(instance, name, value) è zucchero sintattico per instance.__setattr__(name, value).

Si avrebbe solo bisogno di chiamare object.__setattr__(...) all'interno di una definizione di classe, e solo se sottoclasse direttamente object - se si stesse sottoclasse qualcos'altro, Spam per esempio, allora si dovrebbe usare sia super() per ottenere l'elemento successivo nella gerarchia , o chiama Spam.__setattr__(...) - in questo modo non rischierai il comportamento mancante che le super classi hanno definito saltando su di loro direttamente su object.

+2

Grazie, questo lo spiega. Il codice sta probabilmente usando 'object .__ setattr__' per lo scopo esatto di saltare il __setattr__ della superclasse. –

+0

_ "setattr (istanza, nome, valore) è zucchero sintattico per esempio .__ setattr __ (nome, valore)" _ - è davvero? Ricordo vagamente che alcuni tipi non hanno '__getattr__' ma ottenere gli attributi funziona per loro indipendentemente. Non è lo stesso qui? –

Problemi correlati