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