簡體   English   中英

python class:為什么在嘗試使用 @property 裝飾器設置屬性時獲得最大遞歸?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM