python-3.x - python : cannot update @property manually

标签 python-3.x properties setter

语言是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

您能否帮我弄清楚如何在更新数据时更新字母表,同时还能够手动将项目添加到>字母表?谢谢!

最佳答案

您可以尝试在名为 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 的不同 View 。

此处的工作示例:https://ideone.com/xp0jve

关于python-3.x - python : cannot update @property manually,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47821754/

相关文章:

django - 如何在django中编译保存在数据库中的模板

python - Pandas DataFrame,计算距下一个指定日期还剩多少天?

python-3.x - 如何让 ScrollView 在 python 中重置到屏幕顶部

java - 使用 Spring (Java) 加载 .properties 文件

javascript - React-Native属性函数参数没有传递

QT 属性 - 语法糖或开发工具

python - 如何在字符串中交替更改大写和小写?

ios - Objective-C:属性类型转换的自定义 setter 警告

C# Setter 和 if 语句

objective-c - @synthesize variable = _variable 会做什么?