2017-08-27 25 views
0

我的代碼的setter/getter方法:Python是怎樣知道打電話與性能

class MyClass: 

    def __init__(self): 
     self.value = 0 

    def set_value(self, value): 
     self.value = 5 

    def get_value(self): 
     return self.value 

    value = property(get_value, set_value) 

a = MyClass() 

我得到以下輸出:

RecursionError: maximum recursion depth exceeded 

我的問題:爲什麼我得到這個輸出?爲什麼Python調用MyClass.value .__ set__而不是將實例變量設置爲0?

我的意思是屬性對象是一個類變量,當初始化a -instance我不會對類變量做任何事情。希望你明白我的意思。

+0

有趣的輸出,我不會期待這一點。只是想補充一點,將'value'變成一個私有變量(替換爲__value)可以解決這個問題。 – Michael

+1

@邁克爾,並沒有把它變成私人的,它只是名字而已。只要屬性後面的屬性具有不同的名稱(傳統上帶有*單個*前導下劃線,但可能完全不同),則不會有遞歸。 – jonrsharpe

+1

它調用'MyClass.value .__ set__',因爲*屬性的工作方式*。否則,只要您分配給該屬性,就立即使用值替換該屬性。 – jonrsharpe

回答

0

通過執行value = property(get_value, set_value)您聲明瞭新的描述符。從現在起instance.valueinstance.value = x將撥打.get_value().set_value()

+0

之所以在這裏:https://stackoverflow.com/a/36607870/5005715 – Aliquis

相關問題