Имя искажается при использовании @property в Python - PullRequest
1 голос
/ 06 апреля 2020

Я получил следующий код:

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.

...