0

问题

有没有办法让两个类同时相互继承?

背景

我目前正在开发一个 Socket Server 项目。在这个项目中,我有两个类,一个Server类,一个GUI类。他们的目的是不言自明的。但是,我显然需要让这两个类相互通信。在程序中,我先声明Socket_Server类,然后再声明GUI类。

我问了一个类似的问题,How to Access Functions from Methods in Python,但从未得到令人满意的回答。请尝试回答。

代码和错误

GUI课堂上,我有一个名为self.message.It 的文本框,用于向所有客户端发送消息。我试图通过使用这种语法来继承这个类:

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_serverSocket_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'
4

2 回答 2

2

这个问题的标题与你一开始提出的问题不同(而且更准确一点),但它们都不符合你想要的。您需要的是沟通不同类的两个实例;那不是继承。

当你使用继承时,你应该问自己是否每个 X 也是一个 Y:

  • 是每Employee一个Person是的
  • 是每Person一个Employee
  • 是每Employee一个Car

考虑到这个概念,您可能会看到第三个示例与GUI和之间的关系最相似Server。这是因为你真正的问题是:

  • 实例是否GUI使用Server对象?

如果答案是肯定的,那么服务器应该是你的GUI类的一个属性。在以下示例中,您可以看到GUI调用Server对象的方法,但反之则不然:

import Tkinter as tk
import threading
import socket

class Server():
    def __init__(self):
        self.addresses = [('localhost', 12345)] # All addresses to send data
    def sendtoall(self, data):
        for address in self.addresses:
            self._send(address, data)
    def _send(self, address, data):
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.connect(address)
            sock.sendall(data)
        finally:
            sock.close()

class GUI(tk.Tk):
    def __init__(self, server):
        tk.Tk.__init__(self)
        self.server = server
        self.entry = tk.Entry(self)
        self.button = tk.Button(self, text="Send", command= self.sendmessage)
        self.entry.pack()
        self.button.pack()
    def sendmessage(self):
        message = self.entry.get()
        threading.Thread(target=self.server.sendtoall, args=(message,)).start()

server = Server()
gui = GUI(server)
gui.mainloop()

编辑:此代码看起来更像是客户端而不是服务器,因此将其重命名为更类似于您想到的概念可能是个好主意(例如,Notifier

于 2013-03-10T02:07:18.850 回答
0

您遇到的问题是面向对象。你需要去看看继承是如何工作的,对象是如何交互的,所以第四个是一个有点沉重的主题,需要在一篇文章中介绍,并且需要经验来理解它。

关于 tkinter 的旁注,命令属性是 Button 需要参考。这样每次单击按钮时都会调用该函数。

self.send = Button (self.messageFrame, text = "Send",
                        command = new_server.send_cmd())

也就是说,命令等于 new_server.send_cmd() 的结果。

self.send = Button (self.messageFrame, text = "Send",
                    command = new_server.send_cmd)

这是说 command 等于对 send_cmd 方法的引用。

于 2013-03-10T01:10:03.943 回答