Я создаю несколько экземпляров моего класса в цикле и ожидаю, что они будут независимыми. Но к моему смущению, когда я создаю новый экземпляр с тем же именем, он сохраняет свойства экземпляра, созданного ранее.путаница о экземплярах классов
Так что у меня что-то вроде:
class myClass(object):
def __init__(self, i1 = None, i2 = 'X', p1 = [], p2 = []):
self.i1, self.i2 = i1,i2
self.property1 = p1
self.property2 = p2
def doStuff(self):
self.property1.append(self.i1)
self.property2.append(self.i2)
print self.property1
print self.property2
class mySubClass(myClass):
def __init__(self, i1 = None, i2 = 'Z'):
myClass.__init__(self, i1, i2)
inputTuples = (('A', 'B'), ('D', 'E'))
for x,y in inputTuples:
o=mySubClass(x)
pprint(vars(o))
o.doStuff()
print(id(o))
{'i1': 'A', 'i2': 'Z', 'property1': [], 'property2': []}
['A']
['Z']
37087832
{'i1': 'D', 'i2': 'Z', 'property1': ['A'], 'property2': ['Z']}
['A', 'D']
['Z', 'Z']
37088392
Так для 1-й раз это петли, pprint показывает o.property1 = [] во второй раз, он показывает o.property1 список все, что есть добавляется к o в первом запуске цикла.
Мое понимание было то, что, когда я звоню о = MyClass(), новый экземпляр этого класса будет создан, и старый будет удален (эффективно overwrtitten)
Может кто-нибудь объяснить мне, как питон здесь работает и как я могу заставить его работать так, как я хочу?
Если изменить класс
class myClass(object):
def __init__(self, i1 = None, i2 = 'X':
self.i1, self.i2 = i1,i2
self.property1 = []
self.property2 = []
он работает отлично
{'i1': 'A', 'i2': 'Z', 'property1': [], 'property2': []}
['A']
['Z']
37087832
{'i1': 'D', 'i2': 'Z', 'property1': [], 'property2': []}
['D']
['Z']
37088392
Я не понимаю, принципиальное различие здесь. Кроме того, как я могу сохранить возможность наличия p1 и p2 в качестве входных переменных и все еще иметь желаемое поведение?
Этот код на самом деле не работает, и трудно понять, что делает ваш реальный код. Попробуйте создать [SSCCE] (http://sscce.org), который демонстрирует вопрос. – abarnert
Я предполагаю, что, хотя код, который вы пишете, не отражает этого, вы на самом деле используете переменные класса (а не 'self.property1 = []', которые вы показываете здесь). Они действительно разделяются между экземплярами класса. Но вам нужно сделать фактически воспроизводимый пример вашей проблемы, чтобы мы имели представление о том, что это такое –
Каждый раз, когда вы создаете экземпляр класса ('myClass()'), он создает новый объект, поэтому он не будет «перезаписывать» любой другие экземпляры этого класса. – astephenb