Я получил следующий код:
class Prop:
def __init__(self, number):
self.number = number
@property
def number(self):
print("Get number...")
return self.__number
@number.setter
def number(self, number):
if number == 0:
print("Setting: 0")
self.__number = 0
elif 20 > number > 10:
print("Setting: 15")
self.__number = 15
else:
print("Setting 5")
self.__number = 5
def nr(self):
print(self.number)
def main():
p = Prop(200)
print(p.number)
p.nr()
print(p._Prop__number)
if __name__ == '__main__':
main()
И, честно говоря, я не понимаю, как это работает, что self.__number
в getter и setter является той же переменной, что и в __init__
. Как я понимаю, все __number
будут изменены на _Prop__number
, поэтому это не то же самое, что self.number
(имя которого не изменилось). Когда я изменяю self.number
в __init__
на self.__number
(с изменением имени получателя и установщика), он не работает вообще одинаково. Какой механизм стоит за этим?
------ EDIT -------
ОК. Я, наверное, должен задать вопрос по-другому. Правильный - почему это работает? Я имею в виду - все __number
изменены на _Prop__number
и number
в __init__
нет (поэтому, в конце у него будет другое имя), но это все равно та же самая переменная (не так ли?) по сеттеру / получателю.
Что я имею в виду при изменении всего числа на __number
(в __init__
и в имени сеттера / получателя):
class Prop:
def __init__(self, __number):
self.__number = __number
@property
def __number(self):
print("Get number...")
return self.__number
@__number.setter
def __number(self, __number):
if __number == 0:
print("Setting: 0")
self.__number = 0
elif 20 > __number > 10:
print("Setting: 15")
self.__number = 15
else:
print("Setting 5")
self.__number = 5
def nr(self):
print(self.__number)
def main():
p = Prop(200)
print(p.__number)
p.nr()
print(p._Prop__number)
if __name__ == '__main__':
main()
Это приводит к:
Traceback (most recent call last):
File "D:/python/tkinter_tutorial/test/property.py", line 34, in <module>
main()
File "D:/python/tkinter_tutorial/test/property.py", line 27, in main
p = Prop(200)
File "D:/python/tkinter_tutorial/test/property.py", line 3, in __init__
self.__number = number
File "D:/python/tkinter_tutorial/test/property.py", line 20, in __number
self.__number = 5
File "D:/python/tkinter_tutorial/test/property.py", line 20, in __number
self.__number = 5
File "D:/python/tkinter_tutorial/test/property.py", line 20, in __number
self.__number = 5
[Previous line repeated 492 more times]
File "D:/python/tkinter_tutorial/test/property.py", line 12, in __number
if __number == 0:
RecursionError: maximum recursion depth exceeded in comparison
Так что я думаю, что это вошло в бесконечность l oop.