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

