我可能有与此处完全相同的问题: Creating dynamic array in class [python] 但我有更多关于帖子帮助者要求的信息:
referential_array包括: import ctypes
def build_array(size):
if size <= 0:
raise ValueError("Array size should be larger than 0.")
if not isinstance(size, int):
raise ValueError("Array size should be an integer.")
array = (size * ctypes.py_object)()
array[:] = size * [None]
return array
我尝试调整大小:
来自referential_array import build_array 的
class Array:
def __init__(self, size):
assert size >= 0, "size must be positive"
self.the_array = build_array(size)
self.count = 0
self.size = size
def resize(self):
if self.isFull():
self.the_array2 = build_array(self.size*2)
for i in range(len(self)):
self.the_array2.append(self[i])
self.the_array = self.the_array2
self.size = (self.size)*2
elif len(self) < (1/8)*(self.size) and (self.size) >= 40:
self.the_array2 = build_array((self.size)//2)
for i in range(len(self)):
self.the_array2.append(self[i])
self.the_array = self.the_array2
self.size = (self.size)//2
else:
pass
def __str__(self):
result = ""
for i in range(self.count):
result += str(self.the_array[i])
result += "\n"
return result
def __len__(self):
return self.count
def isEmpty(self):
return len(self) == 0
def isFull(self):
return len(self) >= len(self.the_array)
def indexValid(self,index):
return -len(self) <= index and index < len(self)
def __getitem__(self,index):
if self.indexValid(index):
if index >= 0:
return self.the_array[index]
else:
return self.the_array[index+len(self)]
else:
raise IndexError("index out of range")
def __setitem__(self,index,item):
if self.indexValid(index):
if index >= 0:
self.the_array[index] = item
else:
self.the_array[index+len(self)] = item
else:
raise IndexError("index out of range")
def append(self,item):
if not self.isFull():
self.the_array[self.count] = item
self.count += 1
self.resize()
上面的代码给出了一个&#34; AttributeError:&#39; py_object_Array_40&#39;对象没有属性&#39;追加&#39;&#34;
使用[:]:
尝试两个def resize(self):
if self.isFull:
self.the_array2 = build_array(self.size*2)
self.the_array2 = self.the_array[:]
self.the_array = self.the_array2
self.size = (self.size)*2
elif len(self) < (1/8)*(self.size) and (self.size) >= 40:
self.the_array2 = build_array((self.size)//2)
self.the_array2 = self.the_array[:]
self.the_array = self.the_array2
self.size = (self.size)//2
else:
pass
这次我得到了记忆错误。 感谢任何帮助。
答案 0 :(得分:0)
我可能错了,但你确定你的代码缩进了吗?您的所有方法定义都应缩进为:
class Array:
def __init__(self, size):
assert size >= 0, "size must be positive"
self.the_array = build_array(size)
self.count = 0
self.size = size
def resize(self):
if self.isFull:
self.the_array2 = build_array(self.size*2)
for i in range(len(self)):
self.the_array2.append(self[i])
self.the_array = self.the_array2
self.size = (self.size)*2
elif len(self) < (1/8)*(self.size) and (self.size) >= 40:
self.the_array2 = build_array((self.size)//2)
for i in range(len(self)):
self.the_array2.append(self[i])
self.the_array = self.the_array2
self.size = (self.size)//2
else:
pass
如果你没有正确缩进,那么append方法被视为一个适合你的Python模块的函数,而不是一个类方法 - 它可以解释你的第一个错误信息。
答案 1 :(得分:0)
def resize(self):
if self.isFull: # Fix it to self.isFull()
self.the_array2 = build_array(self.size*2)
self.the_array2 = self.the_array[:]
self.the_array = self.the_array2
self.size = (self.size)*2
elif len(self) < (1/8)*(self.size) and (self.size) >= 40:
self.the_array2 = build_array((self.size)//2)
self.the_array2 = self.the_array[:]
self.the_array = self.the_array2
self.size = (self.size)//2
else:
pass
将self.isFull
修复为self.isFull
()因为您永远不会进入其他条件。