Андрей Светлов
Попробую “на пальцах”.
Чтобы присвоить новый атрибут объекту, тот должен иметь __dict__. Для базовых классов (dict в том числе) __dict__ отсутствует в целях оптимизации и красоты конструкции. У всех Питоновских он есть — поэтому наследование от dict присваивание атрибута позволяет.
Ну в общем понятно, потом разберусь. Вообще классно это у пайтона сделано с __*__ методами.
Ну походу объясните всё таки, почему для файла нельзя на __dict__ сослаться (или на __get__ и т.п.) а у совственного класса можно?
По ходу я их перекрыть вздумал и тоже не получил чего ожидал
>>> class A:
def __dict__(self, a):
pass;
def __get__(self, a):
pass;
def __set__(self, a, b):
pass;
p = "asdsa";
>>> a = A
>>> a.p
'asdsa'
>>> a.sd = 'asda'
>>> a.sd
'asda'
>>> a.__dict__
dict_proxy({'__module__': '__main__', '__set__': <function __set__ at 0x01009DB0>, 'p': 'asdsa', '__dict__': <function __dict__ at 0x01009D20>, 'sd': 'asda', '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None, '__get__': <function __get__ at 0x01009D68>})