Python:无法手动更新@属性

Python: cannot update @property manually

语言是 Python 3. 我正在尝试创建一个 class,每次用户更新属性 data 时,属性 alphabet(数据中使用的符号)将被更新。我能够使用 @属性 装饰器来做到这一点,但是当我需要它时我无法手动更新字母表。

目前我有以下代码:

class Test(object):

    def __init__(self):
        self.data = []

    @property
    def alphabet(self):
        if self.data:
            upd = self.alphabetize(self.data)
        else:
            upd = []
        return list(set(upd))

    @alphabet.setter
    def alphabet(self, value):
        self.alphabet += value

    def alphabetize(self, data):
        alph = []
        for i in data:
            alph += [j for j in i]
        return list(set(alph))

确实,当我更新 data:

时,它会更新 alphabet
>>> a = Test()
>>> a.data = ["fg"]
>>> a.alphabet
['f', 'g']

但是当我手动更新 alphabet 时,它崩溃了:

>>> a.alphabet += ["t"]
Traceback (most recent call last):
<...>
RecursionError: maximum recursion depth exceeded

你能帮我弄清楚如何在 data 更新时更新 alphabet,而且同时更新可以手动添加项目到 alphabet?谢谢!

你试试在名为 alphabet 的 属性 的 setter 方法中设置 self.data 怎么样,即 @alphabet.setter.

class Test(object):

    def __init__(self):
        self.data = []

    @property
    def alphabet(self):
        if self.data:
            upd = self.alphabetize(self.data)
        else:
            upd = []
        return list(set(upd))

    @alphabet.setter
    def alphabet(self, value):
        self.data += value

    def alphabetize(self, data):
        alph = []
        for i in data:
            alph += [j for j in i]
        return list(set(alph))

a = Test()
a.data = ["fg"]
print (a.alphabet) # ['f', 'g']

a.alphabet += ["t"]
print (a.alphabet) # ['f', 'g', 't']

a.data = ["abc"]   # over riding alphabet again
print (a.alphabet) # ['a', 'b', 'c']

因为 属性 alphabet 只是 self.data 的不同视图。

这里的工作示例:https://ideone.com/xp0jve