Форум сайта python.su
Недавно обнаружил интересную особенность при работе с классами и словарями в питоне, не видел нигде в документации описание этого,
очень забавная “фича” граничищая с багом :)
Если кто знает, где в документации про это написано и почему оно работает “так” пожалуйста напишите :)
есть вот такой код:
#————————
class MyClass :
var1 = ‘1’
var2 = {'1':'1'}
var3 = {'1':'1'}
def __init__( self ) :
self.var3 = {}
def f1( self ) :
self.var1 = ‘2’
self.var2 = ‘2’
self.var3 = ‘2’
def p1() :
obj = MyClass()
print obj.var1
print obj.var2
print obj.var3
print ‘———————-’
obj.f1()
p1()
p1()
#————————
Запускаем:
1
{'1': ‘1’}
{}
———————-
1
{'1': ‘1’, ‘2’: ‘2’}
{}
———————-
Смотрим внимательно какое значение вывелось у переменной var2 на втором вызове p1()
Я бы все понял, если бы и var1 была равна ‘2’, тогда я бы сказал что это просто “классовые” переменные… (хотя ясен перец что это абсурд для питона)
Но ведь она равна ‘1’, что говорит о том что это все-таки переменные экземпляра класса…
Вобщем хотелось-бы услышать, что кто думает по этому поводу, ибо я так сказать в легком недоумении :)
на всякий случай у меня: Python 2.6.4 (r264:75706, Apr 8 2010, 09:36:32)
PS: с питоном уже 8 лет дружу, но то-ли до этого всегда инициализировал в конструкторе все словари, то-ли лыжи :)
Отредактировано (Авг. 20, 2010 13:17:00)
Офлайн
npriceмда….
PS: с питоном уже 8 лет дружу
Офлайн
+ перечитываем книжку по питону, главу о изменяемых и неизменяемых типах
Офлайн
var2 - атрибут класса, ибо он объявлен на уровне класса и нигде не перекрывается
var3 - атрибут экземпляра, ибо при создании объекта в конструкторе ты явно присваиваешь значение
var1 - атрибут класса, ибо принты идут до вызова метода f1(), а значит у объекта такого атрибута пока нет
с var3 и так все понятно, про него речи быть и не может…
А вот что в var2 будут “докидываться” значения как-то я не ожидал, хотя исходя из такой логики, это поведение понятно…
Вобщем думал что присвоения на уровне описания класса первоначальных “констант” действует и на вновь созданный экземпляр класса…
Видать раньше все-равно в конструкторе все переопределял, а тут вот такой казус случился :)
Вобщем спасибо :)
PS: ага… насчет книжки это точно :) вот это например http://www.ruscript.net/scripts/32/
Отредактировано (Авг. 20, 2010 15:41:08)
Офлайн