像列表/元组一样的setter和getter

4 投票
2 回答
1864 浏览
提问于 2025-04-17 16:37

我有一个项目在用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 这样的索引操作时,定义一些获取和设置的功能呢?

2 个回答

1

更多选择:

与其创建一个新的容器类型,不如使用已经存在的、能满足你需求的元组(tuple):

self.weights = tuple()

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

或者,如果你真的想用列表,那就把权重(weights)设置为一个 @property,并返回原始列表的一个副本。

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

当然可以。你需要在你的类里面重写一下 __setitem__ 这个方法。

class Weights(list):

    def __setitem__(self, key, value):
         ....

这里有一个文档链接,里面有详细的说明:
http://docs.python.org/2/reference/datamodel.html#object.__setitem__

撰写回答