gpt4 book ai didi

python - 在字符串属性中反射(reflect) Python 列表更改

转载 作者:太空宇宙 更新时间:2023-11-04 03:12:11 25 4
gpt4 key购买 nike

我正在寻找一种优雅(高效)的方式来实现以下内容:

我有一个类将值列表存储为字符串(带有分隔符,例如:“-”)。我使用属性(getter 和 setter)将此字符串转换为 Python list

class C(object):
def __init__(self, values):
"""
Construct C with a string representing a list of values.

:type values: str
:param values: List of values
"""
self.values = values

@property
def value_list(self):
""" Values as list """
return self.values.split(" - ")

@value_list.setter
def value_list(self, seq):
self.values = " - ".join(seq)

获取/设置属性即可:

c = C("one - two")
assert c.value_list == ["one", "two"]

c.value_list = ["one", "two", "three"]
assert c.values == "one - two - three"

但我正在寻找一些东西(可能是另一种列表)来自动反射(reflect)列表中的变化。

c.value_list.append("four")
assert c.values == "one - two - three - four"

Traceback (most recent call last):
...
AssertionError

目前,我实现了自己的 list 类,它继承了带有回调系统的 collections.MutableSequence。有更好的方法吗?

编辑:我目前的解决方案

我使用带有“on_change”处理程序的列表,如下所示:

class MyList(collections.MutableSequence):
""" A ``list`` class with a "on_change" handler. """

def __init__(self, *args):
self._list = list(*args)

def on_change(self, seq):
pass

def __getitem__(self, index):
return self._list.__getitem__(index)

def __len__(self):
return self._list.__len__()

def __setitem__(self, index, value):
self._list.__setitem__(index, value)
self.on_change(self._list)

def __delitem__(self, index):
self._list.__delitem__(index)
self.on_change(self._list)

def insert(self, index, value):
self._list.insert(index, value)
self.on_change(self._list)

然后我需要修改我的 C 类来实现此处理程序以反射(reflect)更改。

类的新版本是:

class C(object):
def __init__(self, values):
"""
Construct C with a string representing a list of values.

:type values: str
:param values: List of values
"""
self.values = values

def _reflect_changes(self, seq):
self.values = " - ".join(seq)

@property
def value_list(self):
""" Values as list """
my_list = MyList(self.values.split(" - "))
my_list.on_change = self._reflect_changes
return my_list

@value_list.setter
def value_list(self, seq):
self.values = " - ".join(seq)

这样,列表中的任何更改都会反射(reflect)在 values 属性中:

c = C("one - two")

c.value_list.append("three")
assert c.values == "one - two - three"

c.value_list += ["four"]
assert c.values == "one - two - three - four"

最佳答案

也许我过于简化了您的问题,因为您已经过于简化了您的第一个示例,但我同意一些评论者的观点,并建议您改变存储它的方式。 存储列表,按需生成字符串。

In [1]: class C(object):
...: def __init__(self, values):
...: self.values = values.split(' - ')
...: @property
...: def value_str(self):
...: return ' - '.join(self.values)
...:

In [2]: c = C('one - two - three')

In [3]: c.values
Out[3]: ['one', 'two', 'three']

In [4]: c.values.append('four')

In [5]: c.value_str
Out[5]: 'one - two - three - four'

关于python - 在字符串属性中反射(reflect) Python 列表更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37665739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com