【发布时间】:2013-02-25 09:25:57
【问题描述】:
问题
有没有办法让两个类同时相互继承?
背景
我目前正在处理一个 Socket Server 项目。在这个项目中,我有两个类,一个Server 类和一个GUI 类。他们的目的是不言自明的。但是,我显然需要让这两个类相互通信。在程序中,我首先声明了Socket_Server 类,然后是GUI 类。
我问了一个类似的问题,How to Access Functions from Methods in Python,但从未得到令人满意的回答。请尝试回答。
代码和错误
在GUI 类中,我有一个名为self.message. 的文本框,用于向所有客户端发送消息。我试图通过使用这种语法来继承这个类:
class Socket_Server(GUI.messageFun):
接下来,GUI类继承自Socket_Server——
class GUI(Frame, Socket_Server):
第二个继承GUI(Socket_Server) 工作正常,但第一个失败。
按钮的命令是这样的
self.send = Button (self.messageFrame, text = "Send",
command = lambda: new_server.send_cmd())
new_server 是Socket_Server 类的一个实例。
当前的错误信息是这样的:
Socket Created
Socket Bind Complete
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python27\lib\lib-tk\Tkinter.py", line 1410, in __call__
return self.func(*args)
File "D:\Python Programs\Sockets\IM Project\Server\Server GUI InDev Class.py", line 129, in <lambda>
command = lambda: new_server.send_cmd())
File "D:\Python Programs\Sockets\IM Project\Server\Server GUI InDev Class.py", line 82, in send_cmd
message = self.message.get("0.0",END)
AttributeError: Socket_Server instance has no attribute 'message'
【问题讨论】:
-
注意:这可能不是最合适的标题——我不知道该怎么称呼它。如果您有更好的想法,请随时编辑它。如果您需要更多代码,请发表评论。
-
您似乎对面向对象编程和类层次结构应该如何工作感到困惑。例如,您不应该尝试让
GUI继承自Socket_Server。这种继承关系是在说“GUI 是套接字服务器的特例”,这不是真的! GUI 是 GUI,服务器是服务器。我建议您在继续之前阅读一些介绍性 OOP 教程。 -
@poorsod 哈哈 - 我以为没有人会知道我是新人 :) 我已经阅读了 [this one] (sthurlow.com/python/lesson08) 并且正在努力通过 Dev Shed Tutorial on OOP。我把我的Python Book 租给了我在学校的一位朋友——我很高兴编程开始流行起来。无论如何,您还有其他建议吗?
-
为了帮助您进行搜索,您应该使用对象 composition(其中类包含对其他类实例的引用),而不是继承。
-
关于您之前评论中的链接 - 在我看来,第一个评论充满了废话,您应该忘记它告诉您的一切。 Dev Shed 教程是一个很好的语法参考,但似乎并没有说明 OOP 是什么for。
标签: python oop user-interface python-2.7 tkinter