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

Python跨类访问类内定义的numpy数组报AttributeError如何解决

问题原因与修复方案

错误根因

这个报错的核心原因是你混淆了Python中的类属性和实例属性:

  • 你在Table类的initArray方法中通过self.cells赋值的是实例属性,这类属性仅属于Table类创建的单个实例对象,不属于Table类本身。
  • 你在MatFrame中直接写Table.cells是在访问Table类的类属性,你全程没有定义过这个类属性,自然会触发AttributeError。

另外你的代码逻辑上还有一个疏漏:你已经在App类中初始化了Table的实例self.table,这个实例才持有你创建好的numpy数组,但你创建MatFrame时没有把这个实例传递进去,导致MatFrame没有办法拿到正确的数组对象。

修复步骤

1. 修改MatFrame的初始化逻辑,支持接收Table实例

class MatFrame(tk.Frame):
    # 新增table参数用于接收外部传入的Table实例
    def __init__(self, parent, table):
        tk.Frame.__init__(self, parent)
        self.parent = parent
        self.table = table # 保存传入的Table实例到当前类的属性中
        self.initUI()

    def initUI(self):
        # 从保存的Table实例中访问cells属性,而非直接访问Table类
        rows = len(self.table.cells)
        columns = len(self.table.cells[0])
        self.rows = rows
        self.columns = columns

2. 修改App类中创建MatFrame的逻辑,传入已经初始化的Table实例

class App(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        self.parent = parent
        self.initUI()
    def initUI(self):
        self.parent.title("Matrix GUI")
        self.table = Table()
        # 把已经初始化完成的table实例传给MatFrame
        self.mat_frame = MatFrame(self, self.table)

修改完成后运行代码即可正常访问数组属性。

额外注意事项

你当前的导入逻辑存在冗余冲突:同时写了import tkinter as tk、from tkinter import *、from tkinter.ttk import *,会导致tkinter和ttk的同名组件互相覆盖,后续开发容易出现意料之外的样式问题,建议统一使用import tkinter as tk加前缀的写法导入组件,避免命名冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:57:03