首页 > 解决方案 > 如何修复 AttributeError:“Matrix”对象没有“clear”属性?

问题描述

我正在尝试创建一个 Matrix 类。但是,当我创建它时它会给我带来错误。

我试图删除 self._theGrid.clear(0) 但矩阵将被初始化为 None 而不是 0。

from array_ import Array2D

class Matrix :
    # Creates a matrix of size numRows x numClos initialized to 0.
    def __init__(self, numRows, numCols):
        self._theGrid = Array2D(numRows, numCols)
        self._theGrid.clear(0)
    ....

在我创建的模块中。我正在使用以下模块来创建矩阵。


# Implement the Array ADT using the array capabilities of the ctypes module
import ctypes

class Array:
     # Create array with the size elements
    def __init__(self, size):
        assert size > 0, "Array size must be > 0"
        self._size = size
         # Create the array structure using ctypes module
        PyArrayType = ctypes.py_object * size
        self._elements = PyArrayType()
         # Initialize each element
        self.clear(None)

     # Returns the size of the array
    def __len__(self):
        return self._size

     # Get the contents of the index element
    def __getitem__(self, index):
        assert index >= 0 and index < len(self), "Array subscripts out of range"
        return self._elements[index]

      # Puts the value in the array element at index position.
    def __setitem__(self, index, value):
        assert index >= 0 and index < len(self), "Array subscripts out of range"
        self._elements[index] = value

     # Clear the array by setting each element to the given value.
    def clear (self, value):
        for i in range(len(self)):
            self._elements[i] = value
     # Returns the array's ierator for transversing the elements.
    def __iter__(self):
        return _ArrayIterator( self._elements )
# An iterator for the Array ADT.
class _ArrayIterator:

    def __init__(self, theArray):
        self._arrayRef = theArray
        self._curNdx = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self._curNdx < len(self._arrayRef):
            entry = self._arrayRef[self._curNdx]
            self._curNdx += 1
            return entry
        else:
            raise StopIteration

# Implementation of the Array2D ADT using an array of arrays
class Array2D:
    # Creates a 2-D array of size numRows x numCols 
    def __init__(self, numRows, numCols):
        # Create a 1-D array to store an array reference for each row.
        self._theRows = Array(numRows)

        # Create the 1-D arrays for each row of the 2-D array. 
        for i in range(numRows):
            self._theRows[i] = Array(numCols)

    # Return the number of rows of the 2-D array. 
    def numRows(self):
        return len(self._theRows)

    # Return the number of columns of the 2-D array. 
    def numCols(self):
        return len(self._theRows[0]) 

    # Clear the arrays by setting every element to the given value
    def clear(self, value):
        for row in range(self.numRows()):
            row.clear(value)

    # Gets the contents of the element at position [i,j]
    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 subscripts out of range"
        the1dArray = self._theRows[row]
        return the1dArray[col]

    # Set the contents of the element at position [i,j] to value.
    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

我无法得到所有矩阵条目都初始化为 0 的结果。

第 8 行,在init self._theGrid.clear(0)

第 77 行,在 clear row.clear(value) 中

AttributeError:“矩阵”对象没有属性“清除”

我无法用 x = Matrix(2,3) 初始化矩阵。

标签: pythonarrays

解决方案


您似乎在这里迭代数组的长度:

...
def clear( self, value ):
    for row in range( self.numRows() ):  # row is 0, 1, 2, ...  
        row.clear( value )               # int has no method or attribute with name "clear" -> error is raised
...

尝试遍历数组:

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

推荐阅读