python - 如何从 Python 中的方法访问函数

标签 python oop sockets tkinter

问题

在同一个类中,如何从方法中访问函数?

背景

世界你好!我目前正在使用 Tkinter 开发 GUI IM 程序。要通过套接字发送消息,我需要从方法访问函数。我的 self.network 方法有一个名为 send_message() 的函数,我想访问它。

代码

要访问它,我尝试使用以下代码:

def messageFun(self):

    //Other widgets are here//

    self.send = Button (self.messageFrame, text = "Send",
                        command = self.network(send_message()))
    self.send.grid(row = 1, column = 1, sticky = S)

self.network方法和send_message函数如下:

def network(self):

    def send_message():   
            #Send some data to the remote server
            message = self.message.get("0.0",END)

            try:
                 #set the whole string
                 s.sendall(message)
            except socket.error:
            #Send Failed
                print "Send failed"
                sys.exit()

尽管我努力调试代码,但我总是得到以下消息的奖励:

Traceback (most recent call last):
  File "D:\Python Programs\Sockets\First Project\IM Project\Server GUI InDev.py", line 178, in <module>
    app = Application(root)
  File "D:\Python Programs\Sockets\First Project\IM Project\Server GUI InDev.py", line 73, in __init__
    self.messageFun()
  File "D:\Python Programs\Sockets\First Project\IM Project\Server GUI InDev.py", line 156, in messageFun
    command = self.network(send_message()))
NameError: global name 'send_message' is not defined

最佳答案

network(send_message()) 是一种奇怪的语法,试图触发函数 send_message()

我建议采用这种方式:

def send_message(instance):   
        #Send some data to the remote server
        message = instance.message.get("0.0",END)

        try:
             #set the whole string
             s.sendall(message)
        except socket.error:
        #Send Failed
            print "Send failed"
            sys.exit()

def network(self,what,send_message=send_message):
    if what =='send message":
        send_message(self)


self.send = Button (self.messageFrame, text = "Send",
                    command = self.network("send message"))

无论是这个:

class NENE:
    def __init__(self):
        self.network.__dict__['send'] = send_message

    def send_message(self):   
        #Send some data to the remote server
        message = self.message.get("0.0",END)
        try:
             #set the whole string
             s.sendall(message)
        except socket.error:
        #Send Failed
            print "Send failed"
            sys.exit()

    def network(self):
        pass


self.send = Button (self.messageFrame, text = "Send",
                    command = self.network.send_message())

在第二个代码中,我将 pass 放入 network() 函数中,因为我不知道您的实际函数的内容,但您将此内容代替此pass

我已将这些方法放入 NENE 类中以展示其工作原理。因为 send_message() 必须是与 network() 是方法的实例相同的实例的方法
然后,在每次创建新实例时,send_message() 也会成为 network() 方法的一个属性。
因此,send_message() 完全是实例及其方法之一的属性;但这并不重要,只是它实现了您的目标:send_message() 现在是 network() 的一个属性,可以通过 network< 调用 属性,它知道它适用的实例是什么。

请原谅我糟糕的英语

关于python - 如何从 Python 中的方法访问函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15139000/

相关文章:

python - 推荐一个 Django 项目在 Linux 上运行的地方

c# - 在 C# 中实现 "foos"的集合,它具有 "bars"的子集

oop - 为什么父类无法访问子类成员

php - "call to undefined function"调用类方法时出错

c++ - 执行前解析 STARTUPINFO hStdInput

c++ - 丢包超时 (UDP)

python - 我可以在 gtk 中向现有树模型添加一列吗?

python - 使用 Spark 对分组数据进行快速行间计算

python - 如何将具有无序索引的 Pandas 数据框中的一行移动到第一行?

javascript - WebSocket 连接失败 : Error during WebSocket handshake: Unexpected response code: 400