使用带参数的property.deleter
我想定义一个叫做 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):