Найти - Пользователи
Полная версия: Создание объектов
Начало » Python для новичков » Создание объектов
1
Euler
Собственно код:
class TEST():
	def __init__(self):
		self.s += str(len(self.s))		#к строке дописываем её длину
		self.arr.append(len(self.arr))	#в список добавляем элемент с его длиной
		
	def __str__(self):
		return "s = " + self.s + "\tarr = " + str(self.arr)
	
	s = ""
	arr = []
	
print(TEST())
print(TEST())
На выходе получаю:
s = 0   arr = [0]
s = 0 arr = [0, 1]
Совершенно не понимаю поведение транслятора - со строкой всё правильно, новый экземпляр и новая строка, но почему список один и тот же в двух экземплярах?
sergeek
строка иммутабельна, += - создает новую строку
список нет, .append добавляет элемент в существующий
sergeek
наверное хотите так
class TEST():
    def __init__(self):
        self.s = ""
        self.arr = []
        self.s += str(len(self.s))		#к строке дописываем её длину
        self.arr.append(len(self.arr))	#в список добавляем элемент с его длиной
		
    def __str__(self):
        return "s = " + self.s + "\tarr = " + str(self.arr)
	
	
print(TEST())
print(TEST())
JOHN_16
Вообще товарищ sergeek прав, но
Посмотрите внимательно на понятия переменной экземпляра класса и переменной объекта класса,ну это так, на тот случай что бы помнили разницу.
class Test(object):
    l=[]
class Test2(object):
    def __init__(self):
        self.l=[]

sergeek немного опередил с мыслью=)
Euler
Так, понял что нужно определять переменные в конструкторе и всё будет как обычно . А вот поведение переменных, определённых вместе с методами пока не очень понятно. Может порекомендуете статью или учебник с разъяснением этого момента?
sergeek
Описание поведения можно найти тут, но сам я его не читал. Мне как-то проще было вывести эту семантику посредством эксперементирования с атрибутами.
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