Форум сайта python.su
Например если создать свой класс, то можно
>>> 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)
Офлайн
Попробую “на пальцах”.
Чтобы присвоить новый атрибут объекту, тот должен иметь __dict__. Для базовых классов (dict в том числе) __dict__ отсутствует в целях оптимизации и красоты конструкции. У всех Питоновских он есть — поэтому наследование от dict присваивание атрибута позволяет.
Офлайн
Андрей СветловНу в общем понятно, потом разберусь. Вообще классно это у пайтона сделано с __*__ методами.
Попробую “на пальцах”.
Чтобы присвоить новый атрибут объекту, тот должен иметь __dict__. Для базовых классов (dict в том числе) __dict__ отсутствует в целях оптимизации и красоты конструкции. У всех Питоновских он есть — поэтому наследование от dict присваивание атрибута позволяет.
>>> 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>})
Офлайн
__dict__ — это атрибут, имеющий тип dict. Не метод — это важно! В этом словаре хранятся все переменные объекта, созданные из питона. Для объектов на С (dict, list, object) используется другой механизм (какой именно — сейчас непринципиально).
__get__/__set__ применяются не для класса, а для его атрибутов. Если делаем __getattribute__, а у полученного значения есть __get__ — то результатом операции будет вызов этого самого __get__.
У самого класса нужно переопределять __getattribute__/__getattr__ и __setattr__.
Офлайн
Андрей СветловЛадно, толку с вас нету. Сам разбирусь.
__dict__ — это атрибут, имеющий тип dict. Не метод — это важно! В этом словаре хранятся все переменные объекта, созданные из питона. Для объектов на С (dict, list, object) используется другой механизм (какой именно — сейчас непринципиально).
__get__/__set__ применяются не для класса, а для его атрибутов. Если делаем __getattribute__, а у полученного значения есть __get__ — то результатом операции будет вызов этого самого __get__.
У самого класса нужно переопределять __getattribute__/__getattr__ и __setattr__.
Офлайн
atomAlteraНаверное лучше “Сам разберусь”. Наверное тогда со всем и разберетесь или разбиретесь.
Сам разбирусь.
Отредактировано (Июль 28, 2011 10:16:19)
Офлайн
atomAlteraАндрей Светлов вам объяснил почему не работает и ответил что нужно сделать для желаемого результата.Андрей СветловЛадно, толку с вас нету. Сам разбирусь.
__dict__ — это атрибут, имеющий тип dict. Не метод — это важно! В этом словаре хранятся все переменные объекта, созданные из питона. Для объектов на С (dict, list, object) используется другой механизм (какой именно — сейчас непринципиально).
__get__/__set__ применяются не для класса, а для его атрибутов. Если делаем __getattribute__, а у полученного значения есть __get__ — то результатом операции будет вызов этого самого __get__.
У самого класса нужно переопределять __getattribute__/__getattr__ и __setattr__.
Офлайн
И что значит “__get__/__set__ применяются не для класса, а для его атрибутов”? Как это можно наглядно посмотреть? Что бы видно было как они вызываются…
А когда применяется __getattribute__, и когда __getattr__?
А вообще прикол
>>> f = open("g:/f.txt", 'w+');
>>> f.__setattr__('123', 144)
>>> f.123
SyntaxError: invalid syntax
>>> f.__getattribute__('123');
144
Отредактировано (Июль 28, 2011 18:14:38)
Офлайн
atomAlteraСинтаксически это некорректно, поэтому и ошибка. Тем не менее питон позволяет вытаскивать и “затаскивать” значения атрибутов и другими способами.
>>> f.123
Отредактировано (Июль 28, 2011 18:19:35)
Офлайн
atomAltera
почитайте Лутца, что ли
Офлайн