财产删除工作无效

时间:2017-09-19 14:18:57

标签: python python-2.7 python-decorators

我尝试使用属性修饰器并执行基本操作,同时执行此错误以及遇到删除器问题而未获得代码的预期输出。

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 个答案:

答案 0 :(得分:1)

您的代码有2个问题。删除器实际上正如人们所期望的那样从属性中删除变量,但这不是您可能想要的,因为您尝试在删除后显示它们。

因此,您可能希望将其替换为0None,而不是实际删除变量。

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

另一个可以让您的代码更直接的选项是不使用del关键字,而是制作一个" clear"功能和用法如val.clear()

第二个问题是使用setter函数,因为它期望有2个变量,但这不能用val.values = something表达式完成。所以我建议你使用以下格式:

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

你会存储这样的值:

val.values = (3, 5)