通过装饰器使用 setter RecursionError

Using setter through decorators RecursionError

我在看一些 link 关于 Python。
https://medium.com/the-renaissance-developer/python-101-object-oriented-programming-part-1-7d5d06833f26

还有用于创建(?)属性的装饰器和一个 setter 方法。下面是代码:

class Vehicle:
    def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity):
        self.number_of_wheels = number_of_wheels
        self.type_of_tank = type_of_tank
        self.seating_capacity = seating_capacity
        self.maximum_velocity = maximum_velocity

    @property
    def number_of_wheels(self):
        return self.number_of_wheels

    @number_of_wheels.setter
    def number_of_wheels(self, number):
        self.number_of_wheels = number

这也是 link 的用法。

tesla_model_s = Vehicle(4, 'electric', 5, 250)
print(tesla_model_s.number_of_wheels) # 4
tesla_model_s.number_of_wheels = 2 # setting number of wheels to 2
print(tesla_model_s.number_of_wheels) # 2

所以,我试图理解为什么我应该使用它,而不是直接访问 class 变量本身。我尝试 运行 代码但我得到了 RecursionError

  File "C:/Users/Brandon/Desktop/Python/tryit.py", line 16, in number_of_wheels
    self.number_of_wheels = number
  [Previous line repeated 491 more times]
RecursionError: maximum recursion depth exceeded while calling a Python object

最后我的问题是,这段代码如何工作(可能有什么问题?)更重要的是,为什么我应该使用 setter 而不是直接访问 class 变量?

ps。欢迎任何像 links 这样的阅读指针或搜索关键字。

属性和属性不能重名,否则setter和getter会不停地调用自己。按照惯例,您会在 privatize(尽管它不是私有的)前添加一个前导下划线,您正在为其创建 属性 的属性。

class Vehicle(object):
    def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity):
        self._number_of_wheels = number_of_wheels
        ...

    @property
    def number_of_wheels(self):
        return self._number_of_wheels

    @number_of_wheels.setter
    def number_of_wheels(self, number):
        self._number_of_wheels = number

还记得在 Python 2 中添加 class object,使您的 class 与 property 一起工作。