You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

矩阵项目中装饰器引发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

问题根源

  1. 装饰器未返回原函数结果:你的func_execution装饰器内部只打印了原函数的执行结果,但没有把结果返回出去,导致调用matrix_sum()时得到的是None,自然无法调用showup()方法。
  2. matrix_sum函数缺少求和逻辑:原代码只初始化了零矩阵,没有实现矩阵元素逐个求和的逻辑,就算装饰器修复,也得不到正确结果。

修复方案

  1. 修改装饰器:在descriptor函数末尾添加return result,将原函数的执行结果返回。
  2. 完善matrix_sum求和逻辑:遍历每个元素位置,累加所有矩阵的对应元素值。
  3. 修复其他小问题:补充randint导入、修正__init__中args的判断条件、修正测试代码中的打印错误。

内容的提问来源于stack exchange,提问作者priant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 12:17:11