python - 使用内存引用重载 [] python 运算符和链接方法

标签 python operator-overloading

是否可以使用初始内存引用重载 [] (__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 风格。

谢谢

最佳答案

正如 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 对象共享数学对象取决于您希望数学对象发生变化时的语义。

关于python - 使用内存引用重载 [] python 运算符和链接方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10962448/

相关文章:

c++ - 运算符重载 C 结构

c++ - 如何让我的类(class)与 std::string operator+ 一起工作

python - 如何只导入 __init__.py 的一部分?

python - 可变长度 'yield' ?

python - 这个 Python 类型提示语法是什么,括号中包含两种类型?

c++ - 运算符 != 对于 std::reverse_iterator c++ 是不明确的

c++ - dylib 中的重载运算符删除替换了 OSX 中的系统运算符

python - Django:无法使用新用户登录

python - 替换位于之间的字符串

scala - 如何将函数编写为二元运算符?