Python:无法手动更新@property

问题描述 投票:2回答:1

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

目前我有以下代码:

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))

实际上,当我更新数据时它会更新字母:

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

但是当我手动更新字母时,它会崩溃:

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

你可以帮我解决一下数据更新时如何更新字母表,同时还可以手动将项目添加到字母表中吗?谢谢!

python-3.x properties setter
1个回答
2
投票

你怎么样尝试在self.data属性的setter方法中设置alphabet,即@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

© www.soinside.com 2019 - 2024. All rights reserved.