同一文件中函数的循环依赖python

时间:2017-04-10 13:30:55

标签: python class definition forward-declaration

我的代码结构如下: -

def send_message(msg):
    print msg + "\n"
    x.new_message("You",msg)


class GUI(Frame):

def createWidgets(self):
    self.input.bind('<Key-Return>',self.send)

def send(self, event):
    send_message(self.contents.get())
    self.contents.set("")
def new_message(self,sender, msg):
    line = sender+": "+msg+"\n"
    self.chat.contents.set(self.chat.contents.get()+line)

def __init__(self):
    self.createWidgets()

x = GUI()

正如您所看到的,这有一些循环的依赖性。函数send_message需要实例x以及GUI的new_message方法。 GUI定义需要send_message。因此,不可能满足所有约束。怎么办?

2 个答案:

答案 0 :(得分:0)

在函数定义时,Python函数中的名称不需要引用任何内容 - 只有在实际调用函数时才会查找它们。所以,你的send_message()完全没问题(尽管将x作为参数而不是全局变量可能会更好。)

您的GUI类将无法实例化,如图所示,因为您没有显示创建的小部件 - 例如self.input。我不知道这有多少是由于您剥离了代码以便发布。

答案 1 :(得分:0)

在您在评论中显示的完整代码中,我们可以看到您在self.mainloop()中呼叫GUI.__init__。这将启动gui的事件处理,并且可能不会在程序完成之前终止。只有这样,作业x = GUI()才会完成,x将可用。

为了避免这种情况,您有多种选择。通常在__init__中进行无限循环可能是一个坏主意。而是在实例化GUI之后调用mainloop()

def __init__(self):
    # only do init

x = GUI()
x.mainloop()

正如jasonharper所说,函数中的python变量只能在执行该函数时查找,而不是在定义函数时查找。因此,运行时中的循环依赖关系大多数时候都不是python中的问题。