【问题标题】:Setters and getters that act like lists/tuples类似于列表/元组的设置器和获取器
【发布时间】:2013-02-21 11:55:10
【问题描述】:

我有一个使用 Numpy 的项目。其中一个类需要一组称为权重的矩阵。出于多种原因,最好将所有这些矩阵值存储为一个长向量,并让每个单独的矩阵成为其中一部分的视图。

self.weightvector = asmatrix(rand(nweights, 1)) # All the weights as a vector
self.weights = list() # A list of views that have the 'correct' shape

for i in range(...):
    self.weights.append(...)

如果该类的用户执行foo.weights[i] = bar 之类的操作,则这些权重将不再是原始权重向量的视图。

Python 是否提供了一种机制,通过该机制可以在诸如 foo.weights[i] = bar 之类的索引完成时定义 getter 和 setter?

【问题讨论】:

    标签: python numpy getter-setter correctness


    【解决方案1】:

    当然。你想在你的类上覆盖 __setitem__ 方法。

    class Weights(list):
    
        def __setitem__(self, key, value):
             ....
    

    这是文档的链接:
    http://docs.python.org/2/reference/datamodel.html#object.__setitem__

    【讨论】:

    • 如果您从list 继承,您可能还需要考虑覆盖__setslice__,请参阅docs
    【解决方案2】:

    更多选项:

    您可以重用现有的容器类型,而不是实现新的容器类型,即一个元组:

    self.weights = tuple()
    
    for i in (...) :
        self.weights += (<new_item>,)
    

    或者,如果您真的想使用列表,请将权重设为 @property 并返回原始列表的副本。

    @property
    def weights(self) :
        return [j for j in self._weights]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      相关资源
      最近更新 更多