Почему нельзя поменять переменную родительского класса через функцию

Добрый день. Прошу подсказать или дать ссылку где бы объяснялось почему происходит следующее:

  1. Первый пример кода:
class parent:
    x = 1

    def change_all(self, value):
        parent.x = value

parent.change_all(3)

Получаем ошибку в Pycharm: TypeError: parent.change_all() missing 1 required positional argument: 'value'

  1. Второй пример кода:
class parent:
    x = 1

    def change_all(self, value):
        parent.x = value

child = parent()

child.change_all(3)

Никаких ошибок нет, все работает, x меняется на 3.

Вопрос: почему можно поменять х через функцию выполненную для объекта класса, но нельзя через функцию для самого класса? Подозреваю что это связано с принципами ООП, но объяснение именно вот этого момента найти не смог, прощу поделиться ссылкой или дать направление куда смотреть


Ответы (1 шт):

Автор решения: Bol4onok

Для того чтобы первый пример работал, вам нужно сделать метод либо классовым, либо статическим, тогда всё будет функционировать нормально, выглядеть это будет вот так для метода класса:

class parent:
    x = 1
    @classmethod
    def change_all(cls, value):
        parent.x = value

parent.change_all(3)
print(parent.x)

Вывод

3

Или же если делать метод статическим:

class parent:
    x = 1
    @staticmethod
    def change_all(value):
        parent.x = value

parent.change_all(3)
print(parent.x)

Вывод

3
→ Ссылка