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
相关产品推荐
相关产品推荐

