Что означает инструкция: self.__set_x(x)?

Мне не понятен смысл инструкции self.__set_x(x). По всем канонам это должна быть операция присваивания т.е. self.__set_x = x. Вот полный код и он работает:

class Data:

    def __init__(self, x):
        self.__set_x(x)               

    def __get_x(self):
        print("Get X")
        return self.__x
    
    def __set_x(self, x):
        self.__x = x
        print("Set X")

    x = property(__get_x, __set_x)

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

Автор решения: Сергей

Разницы большой нет. self.__set_x(x) вызывает как раз "литературный" self.__x = x из метода класса. Если в отладчике по шагам идти, то видно, как ведёт себя класс.

Например, код ниже с обращением к классу:

a = Data(5)

даст на выходе: "Set X". Идя в отладчике по шагам, мы модем видеть, что после обращения к классу в строке выше далее мы попадаем в __init__(self, x), который сразу вызывает метод класса __set_x(self, x), где и срабатывает self.__x = x.

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

Давайте попробую описать на примере. Ниже ваш код и пара строк вызова вашего класса Data

class Data:

    def __init__(self, x):
        self.__set_x(x)               

    def __get_x(self):
        print("Get X")
        return self.__x
    
    def __set_x(self, x):
        self.__x = x
        print("Set X")

    x = property(__get_x, __set_x)
    
myx = Data( 1 )    
print( myx.x )

Если запустить эту программу, то мы увидим такой результат

Set X
Get X
1

self.__set_x(x) в конструкторе класса вызывает собственную функцию установки переменной икс x

Вместо этого, наверное, можно было написать прямо в конструкторе

self.__set_x = x

Но нет. При попытке такого присваивания получаем ошибку

Traceback (most recent call last):
  File "main.py", line 17, in <module>
    print( myx.x )
  File "main.py", line 8, in __get_x
    return self.__x
AttributeError: 'Data' object has no attribute '_Data__x'

Потому что __set_x это не переменная и в неё ничего нельзя присваивать. __set_x - это функция или метод, а значит мы должны передать в неё значение, вызывав эту функцию и открыть круглые скобки, т.е. вот так self.__set_x( x )

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

Ну просто при таком способе описания геттера и сеттера у вас есть в явном виде метод __set_x, так почему его нельзя вызвать при инициализации?

При более традиционном методе описания геттера и сеттера они получаются скрытыми, в явном виде методы геттера и сеттера не видимы как отдельные методы, поэтому их и не используют как методы.

В целом, конечно, питон довольно гибок и многое в нём можно делать разными способами. И тут мы видим как-раз такой пример. Но на мой взгляд геттеры и сеттеры как отдельные методы особого смысла не имеют и такой способ их описания лучше не использовать.

→ Ссылка