Найти - Пользователи
Полная версия: словарь как поле объекта
Начало » Python для новичков » словарь как поле объекта
1
mc
class My(object):
        info = 0
m1 = My()
m2 = My()
m1.info = 13
m2.info = 5
print m1.info

то есть info ведет себя как поле объекта. Если же info сделать словарем
class test(object):
	info = {}
	
t1 = test()
t2 = test()
t1.info['a'] = 1
print t1.info
print t2.info
то info ведет себя как поле класса, то есть статическое поле. Подскажите плз, как сделать, чтобы поле было бы словарем, но при этом не было бы статическим.
Piton23
Вроде как из-за того что число это не изменяемый тип а словарь изменяемый.
Как сделать?

>>> class test():
	def __init__(self):
		self.info = {}
		
>>> t1 = test()
>>> t2 = test()
>>> t1.info['a'] = 1
>>> print t1.info
{'a': 1}
>>> print t2.info
{}
>>> 
beelze
после присвоения атрибуту экземпляра его значение «затеняет» значение атрибута класса
вот иллюстрация «на живую»:
>>> 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}

а является ли значение mutable или нет - тут не при чем
Piton23
Да от перемены мест слагаемых сумма не меняется. Я на уровне класса в конструкторе создаю новые словари. А ты перезаписываешь уже существующие новыми словарями, для каждого из экземпляров. Признаю изменяемость тут не причем. Просто первое что пришло в голову, т.к. он изменяет существующий тип данных, который является изменяемым, а не создает его постфактум как новый. Признаю поторопился с выводом :)
beelze
>А ты перезаписываешь
да нет тут перезаписи никакой. я же привел в примере: 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}
и значение атрибута класса НЕ перезаписывается при присвоении атрибуту экземпляра, а затеняется.
Piton23
Хех, действительно затеняется., снимаю шляпу, подзабыл тонкости. Т.е. если не находит свойства у экземпляра идет вверху по дереву к статическому свойству класса.
Андрей Светлов

«Cтатическое свойство класса» — некорректный термин. Применительно к питону его употреблять нельзя. Есть только instance attribute и class attribute.

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB