Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 18, 2012 14:47:13

mc
От:
Зарегистрирован: 2011-09-21
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

словарь как поле объекта

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 ведет себя как поле класса, то есть статическое поле. Подскажите плз, как сделать, чтобы поле было бы словарем, но при этом не было бы статическим.



Офлайн

#2 Апрель 18, 2012 15:20:22

Piton23
От:
Зарегистрирован: 2011-10-17
Сообщения: 139
Репутация: +  5  -
Профиль   Отправить e-mail  

словарь как поле объекта

Вроде как из-за того что число это не изменяемый тип а словарь изменяемый.
Как сделать?

>>> class test():
	def __init__(self):
		self.info = {}
		
>>> t1 = test()
>>> t2 = test()
>>> t1.info['a'] = 1
>>> print t1.info
{'a': 1}
>>> print t2.info
{}
>>> 

Офлайн

#3 Апрель 18, 2012 15:46:24

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

словарь как поле объекта

после присвоения атрибуту экземпляра его значение «затеняет» значение атрибута класса
вот иллюстрация «на живую»:

>>> 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 или нет - тут не при чем

Отредактировано beelze (Апрель 18, 2012 15:49:48)

Офлайн

#4 Апрель 18, 2012 17:54:28

Piton23
От:
Зарегистрирован: 2011-10-17
Сообщения: 139
Репутация: +  5  -
Профиль   Отправить e-mail  

словарь как поле объекта

Да от перемены мест слагаемых сумма не меняется. Я на уровне класса в конструкторе создаю новые словари. А ты перезаписываешь уже существующие новыми словарями, для каждого из экземпляров. Признаю изменяемость тут не причем. Просто первое что пришло в голову, т.к. он изменяет существующий тип данных, который является изменяемым, а не создает его постфактум как новый. Признаю поторопился с выводом :)

Офлайн

#5 Апрель 18, 2012 18:41:00

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

словарь как поле объекта

>А ты перезаписываешь
да нет тут перезаписи никакой. я же привел в примере: 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)

Офлайн

#6 Апрель 18, 2012 19:23:04

Piton23
От:
Зарегистрирован: 2011-10-17
Сообщения: 139
Репутация: +  5  -
Профиль   Отправить e-mail  

словарь как поле объекта

Хех, действительно затеняется., снимаю шляпу, подзабыл тонкости. Т.е. если не находит свойства у экземпляра идет вверху по дереву к статическому свойству класса.

Офлайн

#7 Апрель 18, 2012 19:33:43

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

словарь как поле объекта

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



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version