【问题标题】:Property deleter is not working属性删除器不起作用
【发布时间】:2018-02-28 09:12:52
【问题描述】:

我正在尝试使用属性装饰器并执行基本操作,同时这样做会出错,并且面临删除器问题并且无法从代码中获得预期的输出。

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)

【问题讨论】:

  • 问题出在 setter 上,确定吗?它应该接受一个参数,即 x 和 y 值的二元组。例如。你可以将 setter 设为 def values(self, (value1, value2)):,尽管这与 Python 3.x 不兼容。但请注意,您应该提供minimal reproducible example,而不仅仅是“遇到错误并面临问题”。
  • 感谢您的建议。编辑过的代码,仍然有错误“AttributeError: 'Numbers' object has no attribute '_x'” @jonrsharpe
  • 这就是应该发生的事情,当您在显式删除该属性后再次访问该属性时,您期望什么?

标签: python python-2.7 python-decorators


【解决方案1】:

您的代码存在 2 个问题。删除器实际上是按照预期从属性中删除变量,但这可能不是您想要的,因为您尝试在删除后显示它们。

因此,与其实际删除变量,不如将它们替换为0 或None。

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

另一个可以使您的代码更直接的选项是不使用 del 关键字,而是创建一个“清除”函数并像 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)

【讨论】:

    猜你喜欢
    • 2016-10-10
    • 1970-01-01
    • 2019-01-02
    • 2016-01-19
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多