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

Python类实例跨类传递的原理及代码疑问解答

问题解析与原理说明

1. 为什么writeDoc的参数First能访问entry1?

你这里存在理解偏差:writeDoc的参数First就是First类的实例引用,不是类本身。

在First.clicked()方法里,writeDoc(First=self)中的self指代当前First类的实例(也就是main()里创建的app对象)。当你把这个实例传给writeDoc的First参数后,该参数就指向了First的实例,自然能访问实例的entry1属性——毕竟entry1是你在First.__init__里用self.entry1定义的实例属性。

2. 为什么writeDoc(First=self)有效,writeDoc(self.First)无效?

self代表当前类的实例,但self.First这个属性在你的First类里从未定义过。你没有在First的任何方法里给self绑定First这个属性,所以调用self.First会直接抛出AttributeError,提示First实例不存在First属性。

而writeDoc(First=self)是直接把当前实例传进去,这是正确的用法。

3. 为什么继承的方式行不通?

你的需求是让writeDoc使用First类的实例,这是一种组合(has-a)关系——writeDoc拥有一个First的实例。但继承是is-a关系,意味着writeDoc是First的子类,这完全不符合你的需求场景。

另外你写的继承代码还有语法错误:

  • super().__init__(First)里传的是First类本身,而First.__init__需要的是Tk窗口对象(root参数),传类肯定会报错;
  • 方法定义和super调用的冒号位置错误,属于语法层面的问题。

优化建议

为了避免命名混淆,建议遵循Python的命名规范:

  • 类名使用大驼峰格式:writeDoc改成WriteDoc;
  • 参数名不要和类名重复,比如把WriteDoc的参数改成first_instance,避免和类名First混淆。

优化后的代码示例:

from tkinter import *

def main():
    main_window = Tk()
    app = First(main_window)
    main_window.mainloop()

class First:
    def __init__(self, root):
        self.root = root
        self.root.title('First Window')

        self.entry1 = Entry(self.root)
        self.entry1.pack()

        btn = Button(self.root, text="click", command=self.clicked)
        btn.pack()
    
    def clicked(self):
        WriteDoc(first_instance=self)

class WriteDoc:
    def __init__(self, first_instance):
        self.first_instance = first_instance
        txt = self.first_instance.entry1.get()
        print(txt)

if __name__ == '__main__':
    main()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:15:34