通过装饰器使用 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
一起工作。
我在看一些 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
一起工作。