Как изменить список объявленный в классе с помощью метода этого же класса
Изучая ООП, выполнял задание по создание класса, который должен содержать в себе значения координат в списке и написать классе метод, с помощью которого можно менять значение координат.
При выполнении функции changeCoords питон выдает ошибку -
ubresolved reference.
class Point:
coords = [1, 2, 3]
def __init__(self, x = coords[0], y = coords[1], z = coords[2]):
self.x = x
self.y = y
self.z = z
def changeCoords(self, x=0, y=0, z=0):
coords[0] = x
coords[1] = y
coords[2] = z
pt = Point()
print(pt.changeCoords(4, 5, 6))
Ввопрос - почему нельзя в методе сослаться на список, объявленный в этом же классе и как все таки с помощью метода класса поменять список coords?
Ответы (2 шт):
Да, вы сделали coords объектом класса:
coords = [1, 2, 3]
Но чтобы обращаться к объекту coords в других методах этого класса
надо добавить self:
self.coords[0] = x
self.coords[1] = y
self.coords[2] = z
class Point(object):
coords = [1, 2, 3]
def __init__(self, x=coords[0], y=coords[1], z=coords[2]):
super().__init__()
self.x = x
self.y = y
self.z = z
print(f'\nx={x}, y={y}, z={z}\n')
def changeCoords(self, x=0, y=0, z=0):
self.coords[0] = x
self.coords[1] = y
self.coords[2] = z
return self.coords
pt = Point()
print(f'111 pt.coords --> {pt.coords}\n')
print(pt.changeCoords(4, 5, 6))
print(f'222 pt.coords --> {pt.coords}\n')
print(pt.changeCoords())
print(f'333 pt.coords --> {pt.coords}\n')
print(pt.changeCoords(777))
print(f'444 pt.coords --> {pt.coords}')
Очень важно при изучении ООП ли, функционального программирования ли, или любой другой парадигмы программирования уметь читать ошибки.
NameError: name 'coords' is not defined- ошибка появилась в следствии пропущенногоself.это не столько ошибка сколько видимо недопонимание,
self.xэто совсем не то чтоself.coords[0]поэтому присваивания в конструкторе класса несколько избыточны, там можно использоватьchangeCoordsСовсем не обязательно знать особенности языка сразу, но все же иногда полезно, например тело метода
changeCoordsможно записать короче (не обязательно).Раз уж мы говорим про
ООПто для получения значений нужно использовать соответсвующий метод,changeCoordsобычно подобные методы не возвращают ничего.
таким образом у нас получается:
class Point:
coords = [1, 2, 3]
def __init__(self, x = coords[0], y = coords[1], z = coords[2]):
self.changeCoords(x, y, z)
def changeCoords(self, x = 0, y = 0, z = 0):
self.coords = [x, y, z]
def getCoords(self):
return self.coords
pt = Point()
pt.changeCoords(4, 5, 6)
print(pt.getCoords())