7

是否可以使用初始内存引用重载[] (__getitem__)Python 运算符和链方法。

想象一下,我有一个Math接受整数列表的类,如下所示:

class Math(object):
    def __init__(self, *args, **kwargs):
        assert(all([isinstance(item, int) for item in list(args)]))
        self.list = list(args)

    def add_one(self):
        for index in range(len(self.list)):
            self.list[index] += 1

我想做这样的事情:

instance = Math(1,2,3,4,5)
instance[2:4].add_one()

执行此代码后instance.list应该是[1,2,4,5,5],这可能吗?

我知道我可以做类似的事情add_one(2,4),但如果可能的话,这不是我想要的 API 风格。

谢谢

4

2 回答 2

9

正如 Winston 提到的,您需要实现一个辅助对象:

class Math(object):
    def __init__(self, *args, **kwargs):
        self.list = list(args)

    def __getitem__(self, i):
        return MathSlice(self, i)

class MathSlice(object):
    def __init__(self, math, slice):
        self.math = math
        self.slice = slice

    def add_one(self):
        for i in xrange(*self.slice.indices(len(self.math.list))):
            self.math.list[i] += 1


instance = Math(1,2,3,4,5)
instance[2:4].add_one()

print instance.list

与 MathSlice 对象共享数学对象的方式取决于如果数学对象发生更改,您希望语义是什么。

于 2012-06-09T16:12:44.823 回答
5

Numpy 做这样的事情。

__getitem__方法将接收一个slice对象。有关详细信息,请参阅http://docs.python.org/reference/datamodel.html。您需要返回一个新对象,但实现该对象以修改原始列表。

于 2012-06-09T16:07:32.707 回答