我想在数组对象上实现一个切片,其中对象负责切片而不会丢失其属性。我最初的实施:
class Array(list):
@property #example
def length(self):
return len(self)
def foo(array_obj)
# some type of merge-sort algorithm
length = array_obj.length
A = foo(array_obj[:(length//2)]) #pass the 1st half of the array_obj to foo()
B = foo(array_obj[(length//2):]) #pass the 2nd half of the array_obj to foo()
def main():
... #create an array from numbers in a file
array_a = Array([number for number in map(int, [line.strip() for line in fh])])
foo(array_a)
内部foo最终获取列表而不是切片的array_obj实例。 (python syntax 3.x)所以,array_obj.length,报告:AttributeError:' list'对象没有属性' length'。
我正在考虑使用递归排序算法,就地排序可能会更有效,更快。其他情况可能会享受深层复制。关于解决这个问题的最佳方法的见解和建议将不胜感激。
答案 0 :(得分:1)
您要做的是覆盖__getitem__
魔术方法。在这种情况下,请执行以下操作:
class Array(list):
@property #example
def length(self):
return len(self)
def __getitem__(self, index):
if isinstance(index, slice):
return Array(super().__getitem__(index))
return super().__getitem__(index)