Уведомления

Группа в Telegram: @pythonsu

#1 Июль 27, 2011 21:04:17

atomAltera
От:
Зарегистрирован: 2011-07-27
Сообщения: 54
Репутация: +  0  -
Профиль   Отправить e-mail  

Почему не всегда работает добавление аттрибутов объектам?

Например если создать свой класс, то можно

>>> class Foo:
pass;

>>> f = Foo();
>>> f.a = "AAA";
>>> f.b = "BBB";
>>> print(f.a, f.b);
AAA BBB
И так тоже
>>> f = open("G:/f.txt", 'w+');
>>> f.foo = "Foo attribute";
>>> print(f.foo)
Foo attribute
А вот так нельзя
>>> d = dict()
>>> d.foo = "Foo attribute";
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
d.foo = "Foo attribute";
AttributeError: 'dict' object has no attribute 'foo'
Зато можно вот так
>>> class Foo(dict):
pass;

>>> f = Foo({1: 2, '2': '3'})
>>> f.asd = 'asdas'
>>> f
{1: 2, '2': '3'}
>>> f.asd
'asdas'
Объясните



Отредактировано (Июль 27, 2011 21:07:14)

Офлайн

#2 Июль 27, 2011 21:49:16

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Почему не всегда работает добавление аттрибутов объектам?

Попробую “на пальцах”.
Чтобы присвоить новый атрибут объекту, тот должен иметь __dict__. Для базовых классов (dict в том числе) __dict__ отсутствует в целях оптимизации и красоты конструкции. У всех Питоновских он есть — поэтому наследование от dict присваивание атрибута позволяет.



Офлайн

#3 Июль 27, 2011 22:17:07

atomAltera
От:
Зарегистрирован: 2011-07-27
Сообщения: 54
Репутация: +  0  -
Профиль   Отправить e-mail  

Почему не всегда работает добавление аттрибутов объектам?

Андрей Светлов
Попробую “на пальцах”.
Чтобы присвоить новый атрибут объекту, тот должен иметь __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>})



Офлайн

#4 Июль 27, 2011 23:13:49

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Почему не всегда работает добавление аттрибутов объектам?

__dict__ — это атрибут, имеющий тип dict. Не метод — это важно! В этом словаре хранятся все переменные объекта, созданные из питона. Для объектов на С (dict, list, object) используется другой механизм (какой именно — сейчас непринципиально).
__get__/__set__ применяются не для класса, а для его атрибутов. Если делаем __getattribute__, а у полученного значения есть __get__ — то результатом операции будет вызов этого самого __get__.
У самого класса нужно переопределять __getattribute__/__getattr__ и __setattr__.



Офлайн

#5 Июль 28, 2011 07:58:46

atomAltera
От:
Зарегистрирован: 2011-07-27
Сообщения: 54
Репутация: +  0  -
Профиль   Отправить e-mail  

Почему не всегда работает добавление аттрибутов объектам?

Андрей Светлов
__dict__ — это атрибут, имеющий тип dict. Не метод — это важно! В этом словаре хранятся все переменные объекта, созданные из питона. Для объектов на С (dict, list, object) используется другой механизм (какой именно — сейчас непринципиально).
__get__/__set__ применяются не для класса, а для его атрибутов. Если делаем __getattribute__, а у полученного значения есть __get__ — то результатом операции будет вызов этого самого __get__.
У самого класса нужно переопределять __getattribute__/__getattr__ и __setattr__.
Ладно, толку с вас нету. Сам разбирусь.



Офлайн

#6 Июль 28, 2011 10:15:25

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Почему не всегда работает добавление аттрибутов объектам?

atomAltera
Сам разбирусь.
Наверное лучше “Сам разберусь”. Наверное тогда со всем и разберетесь или разбиретесь.



Отредактировано (Июль 28, 2011 10:16:19)

Офлайн

#7 Июль 28, 2011 12:54:08

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Почему не всегда работает добавление аттрибутов объектам?

atomAltera
Андрей Светлов
__dict__ — это атрибут, имеющий тип dict. Не метод — это важно! В этом словаре хранятся все переменные объекта, созданные из питона. Для объектов на С (dict, list, object) используется другой механизм (какой именно — сейчас непринципиально).
__get__/__set__ применяются не для класса, а для его атрибутов. Если делаем __getattribute__, а у полученного значения есть __get__ — то результатом операции будет вызов этого самого __get__.
У самого класса нужно переопределять __getattribute__/__getattr__ и __setattr__.
Ладно, толку с вас нету. Сам разбирусь.
Андрей Светлов вам объяснил почему не работает и ответил что нужно сделать для желаемого результата.

Офлайн

#8 Июль 28, 2011 18:13:25

atomAltera
От:
Зарегистрирован: 2011-07-27
Сообщения: 54
Репутация: +  0  -
Профиль   Отправить e-mail  

Почему не всегда работает добавление аттрибутов объектам?

И что значит “__get__/__set__ применяются не для класса, а для его атрибутов”? Как это можно наглядно посмотреть? Что бы видно было как они вызываются…


А когда применяется __getattribute__, и когда __getattr__?

А вообще прикол

>>> f = open("g:/f.txt", 'w+');
>>> f.__setattr__('123', 144)
>>> f.123
SyntaxError: invalid syntax
>>> f.__getattribute__('123');
144
2Андрей Светлов, по ходу извини я погорячился, не заметил твой рейтинг ;)



Отредактировано (Июль 28, 2011 18:14:38)

Офлайн

#9 Июль 28, 2011 18:17:54

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Почему не всегда работает добавление аттрибутов объектам?

atomAltera
>>> f.123
Синтаксически это некорректно, поэтому и ошибка. Тем не менее питон позволяет вытаскивать и “затаскивать” значения атрибутов и другими способами.

А вы начинаете уважать людей только с рейтингами? )



Отредактировано (Июль 28, 2011 18:19:35)

Офлайн

#10 Июль 28, 2011 20:32:43

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Почему не всегда работает добавление аттрибутов объектам?

atomAltera
почитайте Лутца, что ли



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version