Форум сайта python.su
0
class My(object): info = 0 m1 = My() m2 = My() m1.info = 13 m2.info = 5 print m1.info
class test(object): info = {} t1 = test() t2 = test() t1.info['a'] = 1 print t1.info print t2.info
Офлайн
5
Вроде как из-за того что число это не изменяемый тип а словарь изменяемый.
Как сделать?
>>> class test(): def __init__(self): self.info = {} >>> t1 = test() >>> t2 = test() >>> t1.info['a'] = 1 >>> print t1.info {'a': 1} >>> print t2.info {} >>>
Офлайн
3
после присвоения атрибуту экземпляра его значение «затеняет» значение атрибута класса
вот иллюстрация «на живую»:
>>> class A(): ... a = {'a':1} ... >>> foo = A() >>> A.a {'a': 1} >>> foo.a {'a': 1} >>> foo1 = A() >>> foo.a = {'b':2} >>> foo1.a = {'c':3} >>> A.a {'a': 1} >>> foo.a {'b': 2} >>> foo1.a {'c': 3} >>> foo.__class__.a {'a': 1}
Отредактировано beelze (Апрель 18, 2012 15:49:48)
Офлайн
5
Да от перемены мест слагаемых сумма не меняется. Я на уровне класса в конструкторе создаю новые словари. А ты перезаписываешь уже существующие новыми словарями, для каждого из экземпляров. Признаю изменяемость тут не причем. Просто первое что пришло в голову, т.к. он изменяет существующий тип данных, который является изменяемым, а не создает его постфактум как новый. Признаю поторопился с выводом :)
Офлайн
3
>А ты перезаписываешь
да нет тут перезаписи никакой. я же привел в примере: foo.__class__.a. У экземпляра нет собственного атрибута пока ему не будет присвоено значение. instance.a вернет class.a если нет атрибута у экземпляра. Внимательно поглядите:
>>> class A(): a={'b':1} >>> foo=A() >>> foo1=A() >>> foo.a['b']=100 # мы НЕ присваиваем атрибуту значение! foo.a = {'b':100} - присвоит. >>> foo.a {'b': 100} >>> foo1.a {'b': 100}
Отредактировано beelze (Апрель 18, 2012 18:42:54)
Офлайн
5
Хех, действительно затеняется., снимаю шляпу, подзабыл тонкости. Т.е. если не находит свойства у экземпляра идет вверху по дереву к статическому свойству класса.
Офлайн
14
«Cтатическое свойство класса» — некорректный термин. Применительно к питону его употреблять нельзя. Есть только instance attribute и class attribute.
Офлайн