[英]python class: why do I get maximum recursion when trying to set an attribue with @property decorator?
我正在學習如何在 python 中創建類,其中在修改屬性 1 時將更改屬性 2。例如具有屬性半徑的圓。
class Circle():
def __init__(self,radius):
self._radius = radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
self.radius = value
@property
def area(self):
return 3.14*self.radius*self.radius
這會發生:
c = Circle(3)
c.area
一切都好。 但現在:
c.radius = 56
print(c.area)
給出:
RecursionError: maximum recursion depth exceeded
問題是為什么? 當一個屬性被改變時,強制重新計算其他屬性的方法是什么?
我查閱了幾個答案: Python:修改屬性值如何通過更改另一個屬性的值來更改一個屬性的值? (依賴屬性)
編輯:根據一些答案(見下文)我處於無限循環中。 所以我刪除了setter的部分。 我留在:
class Circle():
def __init__(self,radius):
self._radius = radius
@property
def radius(self):
return self._radius
@property
def area(self):
return 3.14*self.radius*self.radius
然后發生的是:
c = Circle(3)
c.radius = 30
錯誤:AttributeError:無法設置屬性
class Circle():
def __init__(self, _radius, color):
print('init run')
self._radius = _radius
self.color = color
@property
def radius(self):
print('property radius run')
return self._radius
@radius.setter
def radius(self, value):
print('setter radius run')
self._radius = value
@property
def area(self):
print('property AREA run')
return 3.14*self.radius*self.radius
我添加了打印語句,因為如果您想了解實際發生了什么,我建議您在筆記本的單獨單元格中運行此代碼:
c= Circle(3,'azul') # here only __init__ runs
print(c.radius) # here property radius run
print(c.area)
這是有趣的部分。 打印 c.area 時發生了事情。 在運行代碼之前想想你認為它會發生什么我很驚訝但又松了一口氣,因為我現在理解了它的功能。 這就是發生的情況:屬性區域運行,屬性半徑運行,屬性半徑運行。 我的經驗教訓:訪問半徑屬性是通過方法完成的。 這對我來說一點也不明顯。
現在嘗試改變半徑
c.radius = 56 # setter method runs
print(c.area) # the same ass before.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.