【问题标题】:Defining __getitem__ and __setitem__ for a property in python在 python 中为属性定义 __getitem__ 和 __setitem__
【发布时间】:2019-08-12 21:44:43
【问题描述】:

我有一个对象,其中包含一个名为_X 的大型数据表。各种长度的数据示例在_X 中端到端堆叠,我命名为_INDEX 的另一个表对示例编号的映射进行编码 -> 示例所在_X 中的范围。

我想要的是定义一个名为X 的属性,其中包含__getitem____setitem__,这样我就可以使用X[i,j] 访问ith 示例的jth 元素。这是为了避免到处乱写像self._X[self._INDEX[i]:self._INDEX[i+1]][j] 这样令人困惑的冗长行。

我可以使用正确的 __getitem____setitem__ 创建一个包装类,然后从我的 @property 函数中返回它,但我宁愿不必这样做。

【问题讨论】:

  • 该属性实际返回什么?属性本身不需要定义__getitem__,只需要定义属性返回的类。
  • foo.X[3,4]真的是type(foo).X.fget(foo)[3,4];无论X.fget 返回什么都会被索引,而不是X 本身。
  • 如果您编写一个名为X 的函数,其中包含一个冗长的行,则其余代码只需调用a.X(i,j)。为什么那行不通?你不能避免写一次冗长的行。不需要任何属性或特殊方法。
  • 这让我很欣赏 JavaScript,在那里我总是可以覆盖任何绑定的方法。
  • 我不希望它成为一个函数,尽管它会有效地做同样的事情。我希望它看起来像对用户的正确索引。这是几个表之一,我可以在没有任何特殊功能的情况下公开其他表。为了对称,我希望它的行为就像其中之一。

标签: python properties


【解决方案1】:

首先定义一个包装器类,它定义了所需的__getitem__

class Foo:
    def __init__(self, table, index):
        self.table = table
        self.index = index
    def __getitem__(self, k):
        i, j = k
        return self.table[self.index[i]:self.index[i+1]][j]

然后定义你的属性

@property
def X(self):
    return Foo(self._X, self._INDEX)

【讨论】:

  • 没有更干净的方法吗?我真的不想要一个全新的课程。我真的只想覆盖/拦截__getitem____setitem__ 对我的._X 数组的调用。 stackoverflow.com/questions/51159611/…
  • 你没有 a 数组;您有一个定义__getitem__ 的某种类型的对象,并且该对象使用自己的__getitem__ 存储另一个 类型的对象。
  • 这不一定是一个属性,不是吗?它可以只是一个属性。
  • IIUC,该属性是返回一个值的必要条件,该值的类型定义了适当的__getitem__,而不是“原始”值。
  • 我的意思是self.x = Foo(),然后obj.x[x,y] 可以工作,不是吗?
猜你喜欢
  • 2011-07-24
  • 2013-03-03
  • 1970-01-01
  • 2023-03-17
  • 2019-07-11
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
相关资源
最近更新 更多