Найти - Пользователи
Полная версия: Словари и классы "фича" на грани "бага"
Начало » Python для экспертов » Словари и классы "фича" на грани "бага"
1
nprice
Недавно обнаружил интересную особенность при работе с классами и словарями в питоне, не видел нигде в документации описание этого,
очень забавная “фича” граничищая с багом :)

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

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

#————————
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 лет дружу, но то-ли до этого всегда инициализировал в конструкторе все словари, то-ли лыжи :)
dimabest
nprice
PS: с питоном уже 8 лет дружу
мда….

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

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

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


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

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

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

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

PS: ага… насчет книжки это точно :) вот это например http://www.ruscript.net/scripts/32/
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