mar*_*jop 7 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
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情:
instance = Math(1,2,3,4,5)
instance[2:4].add_one()
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
如何与MathSlice对象共享数学对象取决于数学对象更改时您希望语义是什么.
Numpy做了这样的事情.
该__getitem__方法将接收一个slice对象.有关详细信息,请参见http://docs.python.org/reference/datamodel.html.您需要返回一个新对象,但实现该对象以便修改原始列表.
| 归档时间: |
|
| 查看次数: |
459 次 |
| 最近记录: |