[英]@property setter not called in python 3
我有一個大問題,我是@property和setter的新手,但是我需要將它們用於大學作業:我的問題是,getter總是繞過setter,而且當我嘗試將參數傳遞給設置器,它不起作用:
class DumbClass():
def __init__(self, classParam):
self.ciao = classParam
@property
def getCiao(self):
return self.ciao
@getCiao.setter
def setCiao(self,dummy):
self.ciao = dummy
然后,當我稱它為:
pizzo = DumbClass('getter')
pozza = pizzo.getCiao('setter')
print(pizzo.ciao, pozza)
----------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-18-78a6b4607757> in < module>()
1 pizzo = DumbClass('getter')
----> 2 pozza = pizzo.getCiao('setter')
3 print(pizzo.ciao, pozza)
TypeError: 'str' object is not callable
或者,如果我不傳遞任何參數:
pizzo = DumbClass('getter')
pozza = pizzo.getCiao
print(pizzo.ciao, pozza)
----------------------------------------------------------------------
getter getter
我可以叫二傳手嗎?
您的屬性名稱應為ciao
,並且實際變量應類似於_ciao
所以當您執行self.ciao = ...
,它將調用該屬性
class DumbClass():
def __init__(self, classParam):
self.ciao = classParam
@property
def ciao(self):
return self._ciao
@ciao.setter
def ciao(self, dummy):
self._ciao = dummy
僅當您嘗試分配給屬性時才調用設置器。 在行中
pozza = pizzo.getCiao('setter')
您首先使用pizzo.getCiao
(調用getter並返回字符串"getter"
訪問屬性的值,然后嘗試使用參數'setter'
將字符串作為函數調用。
您已基本創建了一個只讀屬性:
>>> pizzo = DumbClass('getter')
>>> pizzo.getCiao
'getter'
>>> pizzo.getCiao = 'foo'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
這是因為在定義getter和setter時沒有使用相同的名稱,因此屬性沒有setter。 (可以說,由於名稱很重要, getCiao.setter
可能會立即引發錯誤,但這並不重要。請getCiao.setter
。)
因此,正確的做法是為兩者使用相同的名稱。 通常的慣例是使用名稱與“名稱”相同的私有變量作為屬性來存儲諸如此類的簡單屬性的基礎數據。
class DumbClass:
def __init__(self, p):
self._ciao = p
@property
def ciao(self):
return self._ciao
@ciao.setter
def ciao(self, v):
self._ciao = v
現在,您應該能夠同時獲取和設置屬性值。
>>> d = DumbClass("hi")
>>> d.ciao
'hi'
>>> d.ciao = 'bye'
>>> d.ciao
'bye'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.