我正在编写一个Java集合类,它将与Jython一起使用。我希望最终用户能够这样操作集合:
myCollection = MyJavaCollection()
myCollection[0] += 10.;
a = myCollection[0]; //a = 10
myCollection[0] += 20.;
b = myCollection[0]; //b = 20
我在Python文档中发现了以下方法:
__getitem__
和__setitem__
方法应该完成括号运算符重载的工作。
__iadd__
方法是+=
的最佳候选方法。
我怎样才能把两者混合起来做我想要的呢?你知道吗
您最初的问题有一个作为索引传递的列表,因此我编写本文时假设您希望访问2D列表的第
(i, j)
元素。您可以通过以下方式定义类:这里重载了
__getitem__
和__setitem__
方法,以便在传递索引列表[i, j]
时检索或设置(i, j)
列表中的第(i, j)
个元素。如果值只是数字,那么语法myCollection([1, 1]) += 10
将10
添加到values[1][1]
。你知道吗如另一个答案所述,如果您不只是在对象中存储数字,那么您可能需要覆盖数据所包含的任何类的
__add__
或__iadd__
方法,以获得所需的行为。你知道吗测试示例类:
documentation on special method names提供了您想知道的关于这种特殊方法的所有信息。如果您不确定需要重载什么方法,那么它可能是一个搜索的好地方。你知道吗
请注意
myCollection[0] += 10.;
的解释如下:因此,要完成这项工作,您需要实施:
__getitem__
和__setitem__
在MyJavaCollection
上;和__iadd__
(或者__add__
,如果__iadd__
没有实现的话,Python会退回到这个位置)在上,不管.__getitem__
返回的是什么,而不是MyJavaCollection
本身-如果它返回的是已经实现了加法的东西,比如你的例子中的float
,你就没事了。你知道吗快速演示:
相关问题 更多 >
编程相关推荐