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