如何共享两个类之间的数据(How to share data between two classes

2019-08-17 10:52发布

有没有办法有两个班同时从彼此继承?

背景

我目前工作的一个套接字服务器项目。 在这个项目中,我有两个班,一个Server类和GUI类。 它们的目的不言自明。 但是,我显然需要有两个类相互通信。 在节目中,我首先声明Socket_Server类,然后将GUI类。

我问过类似的问题, 如何访问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'

Answer 1:

这个问题的标题是不同的(多一点准确)比你问开头的问题,但他们都不适合你想要的东西。 你需要的是沟通不同类别的两个实例; 不是继承。

当您使用继承,你应该问自己,如果每个X也是Y:

  • 是每一个Employee一个Person
  • 是每个PersonEmployee没有
  • 是每一个Employee一个Car没有

有了这个概念一点,你可能会看到第三个例子是最相似的关系GUIServer 。 那是因为你真正的问题是:

  • 做一个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



Answer 2:

您有麻烦的事情是面向对象的。 你需要去查找继承如何工作,如何对象进行交互,因此第四它有点沉重的主题在一个岗位覆盖和将要采取的经验让你的头周围。

旁注约Tkinter的,该命令属性按钮把一个参考。 这是为了让每一个按钮被点击时会调用该函数。

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)

这一个是说,命令等于refernce到send_cmd方法。



文章来源: How to share data between two classes