2013-05-30 3 views
0

Я знаю, что вы должны знать, в то время как redefine setattr метод, который вы могли бы закончить в цикле.Python: избегайте цикла __setattr__, используя __dict__, не должен ли он зацикливаться?

Я знаю, что есть два решения, чтобы избежать петли:

1) с использованием объекта суперкласса, вызов:

object.__setattr__(instance,attr,value) 

2) с использованием класса Dict:

self.__dict__[attr] = value 

Мой вопрос, не должно ли решение __dict__ оказаться в петле? и почему это не так?

Это потому, что мы вызываем __setattr__ объекта __dict__ (все объекты) или что?

И если да, не должно ли оно работать одинаково для всего?

+0

'a [b] = c' не устанавливает атрибут. Он устанавливает элемент. Это другое понятие и концептуально, и w.r.t. используемые методы. – delnan

ответ

5

Почему вы ожидаете, что это закончится в цикле?

instance.__dict__[attr] = value - в основном то, что object.__setattr__(instance,attr,value). (Для нормальных атрибутов). Обратите внимание, что __dict__[attr] = whateverне звонит __setattr__. Он называет __setitem__ который совсем другой метод.

+1

Он также называет его совершенно другим объектом. – delnan

+0

@ delnan - Правда. Конечно, используя '__getattribute__', вы можете попасть в бесконечный цикл, используя' self .__ dict__', но ... – mgilson

+0

Так оно и есть потому, что вызывает __setitem__ или потому что это другой объект? Спасибо, парни – Mattia