使用带参数的property.deleter

0 投票
1 回答
675 浏览
提问于 2025-04-18 10:48

我想定义一个叫做 deleter 的属性,这个属性需要一个参数,用来处理 Character 类的一个属性,具体如下:

class Character(object):
    _status = None

    @property
    def status(self):
        """ Return _status if it exists or False if not."""
        return self._status

    @status.setter
    def status(self, status_value):
        """
        Receive the status and the duration(continous or not) and add
        it for the _status.
        """
        if not self._status:
            self._status = []

        self._status.append(status_value)

    @status.deleter
    def status(self, status_value):
        """
        Delete the specified object from the _status list.
        """
        status = [value for value in self._status
                  if status_value in value.keys()]
        if status:
            self._status.remove(self._status.index(status[0]))

我想从状态中删除一个特定的对象。

>>>a = Character()
>>>a.status = 'Test'

这样会返回一个包含1个元素的列表:

>>>a.status
['Test']

如果我再次设置状态,旧的值会保留,同时新的值会被添加到列表中:

>>>a.status = 'Dazed'
>>>a.status
['Test', 'Dazed']

我还想从列表中只删除一个特定的值:

>>>del a.status('Dazed')

期望的结果应该是:

>>> a.status
['Test']

问题是,当我尝试这样做时:

del a.status('Dazed')

会出现以下错误:

SyntaxError: can't delete function call

有没有办法在 property.deleter 中使用参数?

1 个回答

2

你想要实现的这个行为有点奇怪,可能会让使用你这个类的人感到困惑。我肯定不会期待:

self.status = "happy"

会把新的字符串添加到已有的列表里。

据我所知,@property.deleter 不能接收参数。

一个更好的方法可能是把 character.status 设为一个 set(我假设你是想把它当作一个 实例属性,但这同样适用于 类属性):

class Character(object):

    def __init__(self, ..., status=None):
        if status is None:
            self.status = set()
        else:
            self.status = set(status)
        ...

conan = Character(..., status=("happy", "cold"))

conan.status.add("tired")

conan.status.remove("happy")

使用 set 的一个好处是它可以防止重复项。此外,它还可以快速检查某个元素是否在里面(比如 if "warm" in conan.status:),而且你可以很容易地判断两个 Character 实例是否有相同的 status

if conan.status.intersection(other_character.status):

撰写回答