矩阵项目中装饰器引发AttributeError:'NoneType'对象无showup属性
矩阵求和结果调用
showup()报错:'NoneType' object has no attribute 'showup' 问题背景
我正在开发矩阵相关项目,实现了矩阵元素乘指定数字的方法,以及矩阵求和函数。但调用求和结果的showup()方法时触发上述错误,移除装饰器或不调用matrix_sum时一切正常,怀疑是调试装饰器的问题。
SquareMatrix类与matrix_sum函数代码
from random import randint # 注意:原代码缺少此导入 class SquareMatrix(): def __init__(self, rows, random=False, *args): self.rows = rows def random_sequence(rows): "Creates a random sequence" sequence = [] n = 1 while n <= rows: a = randint(1, 100) sequence.append(a) n += 1 return sequence def type_check(args): """Checks if arguments fit for methods""" if isinstance(args[0], int): return list(args) elif (isinstance(args[0], list) or isinstance(args[0], tuple)) and len(args) == 1: return args[0] else: print("Only lists or matrix's elements individually") if random: matrix = random_sequence(rows ** 2) self.matrix = matrix elif args: # 原代码用args != None,改为直接判断args是否非空 self.matrix = type_check(args) else: print("No arguments were entered") def showup(self): n = 1 for a in self.matrix: print(a, end=" ") if n % self.rows == 0: print() n += 1 print("\n") @func_execution def multiply_on_number(self, number): for idx in range(len(self.matrix)): self.matrix[idx] *= number return self @func_execution def matrix_sum(*matrixes): # 检查矩阵尺寸是否一致 test_rows = matrixes[0].rows for matrix in matrixes: if matrix.rows != test_rows: print("Only matrices of the same size !") return False # 初始化零矩阵 sum_matrix = SquareMatrix(rows=test_rows, random=True) sum_matrix.multiply_on_number(number=0) # 原代码缺少求和逻辑,此处补充 for idx in range(len(sum_matrix.matrix)): total = 0 for mat in matrixes: total += mat.matrix[idx] sum_matrix.matrix[idx] = total return sum_matrix
测试代码
m1 = SquareMatrix(3, random=True) m1.showup() m1.multiply_on_number(2) m1.showup() print(type(m1)) sdf = [7, 45, 34, 356, 22, 11, 55, 33, 44] m2 = SquareMatrix(3, False, sdf) m2.showup() print(type(m2)) m3 = SquareMatrix(3, False, 22, 11, 44, 22, 11, 44, 22, 11, 44) m3.showup() print(type(m3)) # 原代码是print(f"type(m3)"),此处修正 b = matrix_sum(m1, m2, m3) print(type(b)) b.showup()
错误信息
'NoneType' object has no attribute 'showup'
调试装饰器代码
def func_execution(func): def descriptor(*args,**kwargs): print(f"\n{'':>50}Running {func.__name__}") print(f"Description: {func.__doc__ or 'No description'}") print(f"\tPositional arguments: {args}") n = 1 print("Positional argument types:") for arg in args: print(f"\t{n}. {type(arg).__name__}") n +=1 print(f"\tKeyword arguments: {kwargs}") print("Keyword argument types:") for key, val in kwargs.items(): print(f"\t{n}. {key}: {type(val).__name__}") n += 1 # 核心问题:原装饰器未返回原函数执行结果 result = func(*args,**kwargs) print(f"\tExecution result - {result}") return result # 新增:返回原函数结果 return descriptor
问题根源
- 装饰器未返回原函数结果:你的
func_execution装饰器内部只打印了原函数的执行结果,但没有把结果返回出去,导致调用matrix_sum()时得到的是None,自然无法调用showup()方法。 - matrix_sum函数缺少求和逻辑:原代码只初始化了零矩阵,没有实现矩阵元素逐个求和的逻辑,就算装饰器修复,也得不到正确结果。
修复方案
- 修改装饰器:在
descriptor函数末尾添加return result,将原函数的执行结果返回。 - 完善matrix_sum求和逻辑:遍历每个元素位置,累加所有矩阵的对应元素值。
- 修复其他小问题:补充
randint导入、修正__init__中args的判断条件、修正测试代码中的打印错误。
内容的提问来源于stack exchange,提问作者priant
相关产品推荐
相关产品推荐

