python 属性 : list-like object

标签 python properties

我正在尝试创建一个对象,其属性类似于列表。这就是我的意思。

class Unit:

    def __init__(self):
        self.val = 0

class Bundle:

    def __init__(self, N=3):
        self.units = [ Unit() for i in range(N) ]

    def getvals(self):
        return [ unit.val for unit in self.units ]

    def setvals(self, vals):
        for i, val in enumerate(vals):
            self.units[i].val = val

    vals = property(getvals, setvals)

现在,这个对象的行为不符合预期。

>>> b = Bundle()
>>> b.setvals([1,2,3])
>>> print b.vals, b.getvals()
[1, 2, 3] [1, 2, 3]
>>> b.vals = [4,5,6]
>>> print b.vals, b.getvals()
[4, 5, 6] [1, 2, 3]

所以语句“b.vals = x”和“b.setvals(x)”是不等价的。你能告诉我为什么,以及如何让它正常运行吗?

最佳答案

在 Python 2 中,property 仅适用于新样式 对象;您的 Bundle必须继承自 object:

class Bundle(object):
    ...

一旦您进行了该更正,该属性将按预期工作:

>>> b.vals = [4,5,6]
>>> b.vals
[4, 5, 6]
>>> b.getvals()
[4, 5, 6]
>>> [unit.val for unit in b.units]
[4, 5, 6]

关于 python 属性 : list-like object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13660346/

相关文章:

ios - 核心数据 : implementing property that is dependent on other

python - 如何使用 itertools.groupby() 获取每个项目的索引和出现

python - Python-sympy 中的求解函数对于线性方程系统非常慢

python-2.7: 在类的 setter 方法中忽略了 doctests

class - 德尔福 2009 : Component Object property default value

c# - 在 C# 中获取、设置属性的真正目的是什么?

python - 将SQLite文件合并成一个db文件,以及 'begin/commit'问题

python - 如果我有足够的 RAM,如何加快解开大型对象的速度?

python - 使用 Beautifulsoup 在页面中查找特定字符串

iOS:从委托(delegate)中获取实例变量值(属性)