Форум сайта python.su
0
FishHook
b в твоём коде - аттрибут класса. Чтобы он стал аттрибутом объекта его нужно определять внутри метода.
Спасибо. А почему a работает так странно? Он ведь тоже аттрибут класса?
Офлайн
568
Информация для размышлений.
class A(object): a = 0 class B(object): b = [] a=A() a1=A() a.a=4 b=B() b1=B() b.b=[1,2,3] print a.a print a1.a print b.b print b1.b
def __init__(self): self.b.append(1)
Офлайн
568
vaultНаверное поэтому
А почему a работает так странно? Он ведь тоже аттрибут класса?
a=3 print hash(a) a+=1 print hash(a)
Офлайн
0
По поводу информации для размышлений: судя по проверенному мной выше, b и b1 будут содержать одинаковые списки, а и а1 - разные переменные. Ну а почему?)
def __init__(self): self.b.append(1)
Офлайн
0
vaultНаверное поэтому
А почему a работает так странно? Он ведь тоже аттрибут класса?
a=3 print hash(a) a+=1 print hash(a)
Офлайн
568
vaultНормально все работает
По поводу информации для размышлений: судя по проверенному мной выше, b и b1 будут содержать одинаковые списки, а и а1 - разные переменные. Ну а почему?)def __init__(self): self.b.append(1)
Так я обращаюсь к self.b ведь. self - экземпляр класса, т.е. объект, нет разве? И почему, во имя Зевса, это по-разному работает для списков и числовых переменных?
class B(): b=[] def __init__(self): self.b=[1,2,3] b=B() b1=B() b.b=[0,0,0] print b.b print b1.b print B.b class A(): a=0 def __init__(self): self.a=9 a=A() a.a=88 a1=A() print a.a print a1.a print A.a
Отредактировано FishHook (Июнь 26, 2012 12:18:06)
Офлайн
568
vaultОбъекты в Питоне бывают двух разновидностей - изменяемые и неизменяемые. Списки, например - объекты изменяемые, их содержимое и длину можно менять. Поскольку ключами словарей могут быть только неизменяемые объекты, в Питоне есть специальный тип неизменяемых списков - кортежи. Числа, естественно, объекты неизменяемые. Также неизменяемыми являются строки, в отличии от многих других языков программирования. Хотя классы, написанные программистами, порождают изменяемые объекты, у программиста есть возможность написать класс, экземпляры которого могут быть ключами словаря.vaultНаверное поэтому
А почему a работает так странно? Он ведь тоже аттрибут класса?a=3 print hash(a) a+=1 print hash(a)
А можете пояснить?)
Офлайн
0
Спасибо, я знал про неизменяемые и изменяемые объекты.
Сейчас попытаюсь переформулировать вопрос:
>>> class B(object): b = [] def __init__(self): self.b.append(1) >>> B_inst1 = B() >>> B_inst2 = B() >>> B_inst1.b [1, 1] >>> B_inst2.b [1, 1]
>>> class B(object): b = [] def __init__(self): self.b = [] self.b.append(1) >>> B_inst1 = B() >>> B_inst1.b [1] >>> B.b [] >>> B_inst1.b = [1,2,3] >>> B_inst2 = B() >>> B_inst1.b [1, 2, 3] >>> B_inst2.b [1] >>> B.b []
Офлайн
173
vaultПроисходит затенение атрибутов класса атрибутами экземпляра:
Тогда почему после выполнения такого кода все объекты имеют b разного значения:
self.b = []
Офлайн
568
vaultОй-ой-ой.
Правильно ли я понял, что здесь при инициализации каждого объекта, фактически, происходит что-то такое: self.b = cls.b?
Офлайн