2011-09-26 19 views
7

Wiem, że nie można wywołać object.__setattr__ na obiektach nie odziedziczonych po object, ale czy jest jeszcze coś innego między tymi dwoma? Pracuję w Pythonie 2.6, jeśli to ma znaczenie.Jaka jest różnica między setattr() a obiektem .__ setattr __()?

+0

'setattr' jest czymś, co wywołujesz na innym obiekcie,' __setattr __() 'jest czymś, co implementujesz na swoim własnym obiekcie. –

+1

'setattr (obj, attr, value)' po prostu wywołuje 'obj .__ setattr __ (attr, value)', przynajmniej dla klas w nowym stylu. – agf

Odpowiedz

12

setattr(instance, name, value) to cukier syntaktyczny do instance.__setattr__(name, value).

będzie trzeba tylko zadzwonić object.__setattr__(...) wewnątrz definicji klasy, a następnie tylko wtedy, gdy bezpośrednio instacji object - jeśli były instacji coś innego, Spam na przykład, to należy użyć super() dostać następną pozycję w heirarchy lub zadzwoń pod numer Spam.__setattr__(...) - w ten sposób nie ryzykujesz brakującego zachowania, które zdefiniowały superklasy, przeskakując je bezpośrednio pod numer object.

+2

Dzięki, to wyjaśnia. Kod prawdopodobnie używa 'object .__ setattr__' dla dokładnego celu pominięcia __setattr__ klasy superklasy. –

+0

_ "setattr (instancja, nazwa, wartość) to na przykład cukier syntaktyczny .__ setattr __ (name, value)" _ - czy to naprawdę? Niejasno pamiętam, że niektóre typy nie mają '__getattr__', ale pobieranie atrybutów działa dla nich niezależnie. Czy tu nie jest tak samo? –

Powiązane problemy