2017-09-19 23 views
-2

我試圖使用屬性裝飾和執行基本的操作,而這樣做收到錯誤以及面臨着缺失者問題,而不是從代碼中獲得預期的輸出。物業刪除器不工作

class Numbers(object): 
    Multiplier = 4 
    def __init__(self, x, y): 
      self._x = x 
      self._y = y 

    def add(self): 
     return self._x + self._y 

    @classmethod 
    def multiply(cls, a): 
     return a*cls.Multiplier 

    @staticmethod 
    def subtract(b,c): 
     return b-c 

    @property 
    def values(self): 
     return "(%d,%d)" % (self._x, self._y) 

    @values.setter 
    def values(self, value1, value2): 
     self._x = value1 
     self._y = value2 

    @values.deleter 
    def values(self): 
     print('deleting') 
     del self._x 
     del self._y 

val = Numbers(2,4) 

print(val.values) 
print(val._x) 
print(val._y) 
print(val.multiply(5)) 
print(val.subtract(8,2)) 
print(val.add()) 
val.values = (34,45) 
print(val.values) 
del (val.values) 
print(val.values) 
+1

的問題是與*二傳手*,肯定?它應該只有一個參數,即x和y值的二元組。例如。你可以使setter的def值(self,(value1,value2)):',儘管這與Python 3.x不兼容。但請注意,您應該給[mcve],而不僅僅是「獲取錯誤以及面臨問題」*。 – jonrsharpe

+0

感謝您的建議。編輯的代碼,仍然有錯誤「AttributeError的:‘數字’對象有沒有屬性‘_x’」而這正是應該發生的,你是怎麼想到當你明確地將其刪除後再次訪問屬性@jonrsharpe –

+2

? – jonrsharpe

回答

1

有兩個問題與您的代碼。刪除者實際上是按照人們所期望的從屬性中刪除變量,但這不是你可能想要的,因爲你試圖在刪除後顯示它們。

因此,而不是實際刪除變量,也許你想用0None來代替它們。

@values.deleter 
def values(self): 
    print('deleting') 
    self._x = None 
    self._y = None 

,可以使你的代碼更直接的另一種方法是不使用del關鍵字,而是做一個「清」功能,並使用像val.clear()

第二個問題是與二傳的功能,因爲它是期待2個變量,但這不能用val.values = something表達式來完成。所以,我建議你使用以下格式:

@values.setter 
def values(self, values): 
    value1, value2 = values 
    self._x = value1 
    self._y = value2 

而且你將存儲這樣的值:

val.values = (3, 5)