Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 20, 2010 13:12:08

nprice
От:
Зарегистрирован: 2010-08-20
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Словари и классы "фича" на грани "бага"

Недавно обнаружил интересную особенность при работе с классами и словарями в питоне, не видел нигде в документации описание этого,
очень забавная “фича” граничищая с багом :)

Если кто знает, где в документации про это написано и почему оно работает “так” пожалуйста напишите :)

есть вот такой код:

#————————
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)

Офлайн

#2 Авг. 20, 2010 13:54:15

dimabest
От:
Зарегистрирован: 2009-02-12
Сообщения: 253
Репутация: +  0  -
Профиль   Отправить e-mail  

Словари и классы "фича" на грани "бага"

nprice
PS: с питоном уже 8 лет дружу
мда….

что выводят твои принты:

var2 - атрибут класса, ибо он объявлен на уровне класса и нигде не перекрывается
var3 - атрибут экземпляра, ибо при создании объекта в конструкторе ты явно присваиваешь значение
var1 - атрибут класса, ибо принты идут до вызова метода f1(), а значит у объекта такого атрибута пока нет



Офлайн

#3 Авг. 20, 2010 15:25:07

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Словари и классы "фича" на грани "бага"

+ перечитываем книжку по питону, главу о изменяемых и неизменяемых типах



Офлайн

#4 Авг. 20, 2010 15:32:57

nprice
От:
Зарегистрирован: 2010-08-20
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Словари и классы "фича" на грани "бага"


var2 - атрибут класса, ибо он объявлен на уровне класса и нигде не перекрывается
var3 - атрибут экземпляра, ибо при создании объекта в конструкторе ты явно присваиваешь значение
var1 - атрибут класса, ибо принты идут до вызова метода f1(), а значит у объекта такого атрибута пока нет


с var3 и так все понятно, про него речи быть и не может…
А вот что в var2 будут “докидываться” значения как-то я не ожидал, хотя исходя из такой логики, это поведение понятно…

Вобщем думал что присвоения на уровне описания класса первоначальных “констант” действует и на вновь созданный экземпляр класса…

Видать раньше все-равно в конструкторе все переопределял, а тут вот такой казус случился :)

Вобщем спасибо :)

PS: ага… насчет книжки это точно :) вот это например http://www.ruscript.net/scripts/32/



Отредактировано (Авг. 20, 2010 15:41:08)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version