2016-11-12 2 views
0

В настоящее время у меня есть курс структуры данных с использованием python. В книге они включили два разных класса для реализации структуры массива 1D и 2D-массива.Создайте объект из класса 2D-массива в python

Для 1D массив:

import ctypes 
class Array: 

def __init__(self, size): 
    assert size > 0, "Array size must be > 0" 
    self._size = size 
    PyArrayType = ctypes.py_object * size 
    self._elements = PyArrayType() 
    self.clear(None) 

def len(self): 
    return self._size 

def getitem(self, index): 
    assert index >= 0 and index < self.len(), "Array subscript out of range" 
    return self._elements[index] 

def setitem(self, index, value): 
    assert 0 <= index < self.len(), "Array subscript out of range" 
    self._elements[index] = value 

def clear(self, value): 
    for i in range(self.len()): 
     self._elements[i] = value 

def iter(self): 
    return ArrayIterator(self._elements) 

класс ArrayIterator: Защиту INIT (самость, theArray): self._arrayRef = theArray self._curNdx = 0 Защиту ИТЭР (Я): Самовозврат защиту следующий (Я): если self._curNdx < Len (self._arrayRef): е nУзнать о = self._arrayRef [self._curNdx] self._curNdx + ​​= 1 запись возвращение еще: рейз StopIteration

class Array2D : 
def __init__(self, numRows, numCols): 
    self._theRows = Array(numRows) 
    for i in range(numRows) : 
     self._theRows[i] = Array(numCols) 
def numRows(self): 
    return len(self._theRows) 

def numCols(self): 
    return len(self._theRows[0]) 

def clear(self, value): 
    for row in range(self.numRows()): 
     row.clear(value) 

def __getitem__(self, ndxTuple): 
    assert len(ndxTuple) == 2, "Invalid number of array subscripts." 
    row = ndxTuple[0] 
    col = ndxTuple[1] 
    assert row >= 0 and row < self.numRows() \ 
     and col >= 0 and col < self.numCols(), \ 
      "Array subscript out of range." 
    the1dArray = self._theRows[row] 

    return the1dArray[col] 

def __setitem__(self, ndxTuple, value): 
    assert len(ndxTuple) == 2, "Invalid number of array subscripts." 
    row = ndxTuple[0] 
    col = ndxTuple[1] 
    assert row >= 0 and row < self.numRows() \ 
     and col >= 0 and col < self.numCols(), \ 
      "Array subscript out of range." 
    the1dArray = self._theRows[row] 
    the1dArray[col] = value 

Я использую следующий код, чтобы понять, как это работает:

arr = Array(5) 
    arrLen = arr.len() 
    arr.clear(0) 
    for i in range (arrLen): 
     print arr.getitem(i) 

    print "The length of the array = ",arrLen 

    print "Enter 5 numbers" 
    for i in range (arrLen): 
    #n = raw_input("num = ") 
    arr.setitem(i,i) 

    for i in range (arrLen): 
    print arr.getitem(i) 
    print"values are ", arr.iter() 

Однако я не знал, как назвать 2D-массив, чтобы понять, как он работает.

ArrMulti = Array2D(3, 4) 

и я получил следующее сообщение об ошибке:

File "MultiArrayADT.py", line 46, in __init__ 
self._theRows[i] = Array(numCols) 
AttributeError: Array instance has no attribute '__setitem__' 

Поэтому, пожалуйста, может кто-то сказать мне, как создать 2D массив объектов.

ответ

0

В вашем классе Array вы должны переопределить метод __setitem__(), в то время как вы внедрили setitem(). Поэтому попробуйте изменить имя метода. Это должно сработать. То же самое с getitem().