通过装饰器使用二传器递归错误



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

并且其中有用于创建(?)属性的装饰器和为其设置的方法。下面是代码:

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

这也是链接的用法。

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

所以,我试图理解为什么我应该使用它,而不是直接访问类变量本身。我试图运行代码,但我得到了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 而不是直接访问类变量?

附言。欢迎任何指针,例如要阅读的链接或用于搜索的关键字。

属性和属性不应该具有相同的名称,否则,二传手和getters将一遍又一遍地调用自己。传统上,您会在前面加上一个前导下划线来私有化(尽管它不是私有的)您为其创建属性的属性。

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 中对object进行子类化,以使你的类与property一起工作。

最新更新