Перезагрузите @ свойство-оформленный метод объекта - PullRequest
2 голосов
/ 05 февраля 2020

Предупреждение: это не производственный код реального использования, это просто попытка углубиться во внутреннюю структуру Python!
Скажем, у меня есть такой (слегка PHP стиль) класс в моем Python код:

class Person:
     _age: int
     def __init__(self, age): self.setAge(age)
     def getAge(self): return self._age
     def setAge(self, age): self._age = age
     def hello(self): print(f"Hello, I'm {self.getAge()}")

Теперь я создаю несколько объектов Person:

tom = Person(20)
betty = Person(22)
john = Person(30)
john.hello()  # output: "Hello, I'm 30"

Теперь давайте предположим, что у Джона есть некоторые причины, чтобы скрыть свой реальный возраст, поэтому мы делаем грязную уловку с помощью перезагрузка его getAge:

john.getAge = lambda: john._age - 5
john.hello()  # output: "Hello, I'm 25"

У нас есть несколько способов сделать это, если Person объявлен более Pythoni c способом с использованием @property?

class Person:
     _age: int
     def __init__(self, age): self._age = age

     @property
     def age(self): return self._age

     @age.setter
     def age(self, x): self._age = x

     def hello(self): print(f"Hello, I'm {self.age}")
...