Как изменить список объявленный в классе с помощью метода этого же класса

Изучая ООП, выполнял задание по создание класса, который должен содержать в себе значения координат в списке и написать классе метод, с помощью которого можно менять значение координат.

При выполнении функции 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 шт):

Автор решения: S. Nick

Да, вы сделали 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}')

    
→ Ссылка
Автор решения: Daniil Loban

Очень важно при изучении ООП ли, функционального программирования ли, или любой другой парадигмы программирования уметь читать ошибки.

  1. NameError: name 'coords' is not defined - ошибка появилась в следствии пропущенного self.

  2. это не столько ошибка сколько видимо недопонимание, self.x это совсем не то что self.coords[0] поэтому присваивания в конструкторе класса несколько избыточны, там можно использовать changeCoords

  3. Совсем не обязательно знать особенности языка сразу, но все же иногда полезно, например тело метода changeCoords можно записать короче (не обязательно).

  4. Раз уж мы говорим про ООП то для получения значений нужно использовать соответсвующий метод, 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())
→ Ссылка