Что означает инструкция: 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.
Давайте попробую описать на примере. Ниже ваш код и пара строк вызова вашего класса 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 )
Ну просто при таком способе описания геттера и сеттера у вас есть в явном виде метод __set_x, так почему его нельзя вызвать при инициализации?
При более традиционном методе описания геттера и сеттера они получаются скрытыми, в явном виде методы геттера и сеттера не видимы как отдельные методы, поэтому их и не используют как методы.
В целом, конечно, питон довольно гибок и многое в нём можно делать разными способами. И тут мы видим как-раз такой пример. Но на мой взгляд геттеры и сеттеры как отдельные методы особого смысла не имеют и такой способ их описания лучше не использовать.