簡體   English   中英

在python 3中未調用@property setter

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

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