Мне нужна помощь, чтобы понять, как работает инициализация python. У меня есть класс (Bar) с другим классом (Foo) как поле/переменная. Когда я пытаюсь инициализировать эту переменную непосредственно в Bar (не в классе __init__), все экземпляры Bar указывают на то же Foo. Но если у меня есть метод __init__, как в Bar2, каждый экземпляр Bar2 будет иметь уникальный экземпляр Foo. Что здесь происходит?Инициализация поля вне __init__
class Foo():
number = 0
class Bar():
foo = Foo()
class Bar2():
foo = None
def __init__(self):
self.foo = Foo()
first = Bar()
second = Bar()
print "Bar"
print first
print second
print first.foo
print second.foo
first = Bar2()
second = Bar2()
print "\nBar2"
print first
print second
print first.foo
print second.foo
выход будет, например, быть:
Bar
<\__main__.Bar instance at 0x025B2AF8>
<\__main__.Bar instance at 0x025B2B20>
<\__main__.Foo instance at 0x004A3AA8>
<\__main__.Foo instance at 0x004A3AA8>
Bar2
<\__main__.Bar2 instance at 0x025B2B48>
<\__main__.Bar2 instance at 0x025B2AF8>
<\__main__.Foo instance at 0x025B2B70>
<\__main__.Foo instance at 0x025B2B98>
Использование Bar оба экземпляра будет ссылаться на тот же экземпляр Foo. Зачем?
Edit: Исправлена ошибка с печатью first.foo дважды Бар. Результирующее поведение по-прежнему наблюдается на выходе.
Не пишите 'class Foo():' в Python 2.x. Это создаст старый класс стиля. Ты почти наверняка этого не хочешь. Вместо этого вы хотите [новый стиль] (http://docs.python.org/reference/datamodel.html#newstyle). Для этого напишите 'class Foo (object):'. – pillmuncher
Я не знал об этом, спасибо, что я тоже. На самом деле я должен был знать, так как это произошло до моей первой встречи с Python. –