关于'if __name__ == '__main__':'的问题

关于'if __name__ == '__main__':'的问题

大家好,在学wxpython过程中,遇到这样的问题,代码如下:
import wx

class Frame(wx.Frame):
        pass

class App(wx.App):
        def OnInit(self):
                self.frame = Frame(parent = None, title = "spare")
                self.frame.Show()
                self.SetTopWindow(self.frame)
                return True
if __name__ == '__main__':
        app = App()
        app.MainLoop()
不加if __name__ == '__main__':这一行的话能显示一个无内容的空frame,为什么加了这一行就不显示,这个技巧在Python中到底是怎么用的,迷惘!
应该是加了才能显示吧。
当这个py文件自运行时,他的 __name__ 属性就被自动赋值为 __main__,所以才会执行 app = App() 和 app.MainLoop()
如果是被其他代码 import 的话, 他的 __name__ 属性被自动赋值为 自己的文件名,就不会执行 app = App() 和 app.MainLoop(),所以就没有窗口了。

说的有错误的话,请高手帮忙指出,谢谢!
这个让我想到作用域的用法....


比如说只限制在内部引用,不知道对不对
还有高手指点吗?我就是因为不加‘if’那一行才显示frame,所以才对书上说的这个技巧感到迷惘,请各位大虾伸出援助之手,不吝赐教几下啊~
我又认真万分地看了一遍Dive into Python里关于这个问题的部分,得出如下理解:
该'if'语句的功能是一个测试套件,如果是该脚本自身运行,则只是测试能否运行,如果是被其他模块所import,就会忽略掉该测试套件语句,而执行该模块的功能。所以我思考着,这是不是在自身运行的时候,不运行功能,而去掉该语句运行自身就能正常执行功能的原因。
理解得对不对请大虾们指点一二,谢谢~
你的错误很有可能是缩近造成的。因为你的去掉if那行,但没有描述,if下面的语句是否做了反缩近的处理。如果没有,那么它们就成为OnInit方法的一部分,所以无法执行。你去掉if应该把后面两句反缩近才可以,如:

[Copy to clipboard] [ - ]
CODE:
import wx

class Frame(wx.Frame):
        pass

class App(wx.App):
        def OnInit(self):
                self.frame = Frame(parent = None, title = "spare")
                self.frame.Show()
                self.SetTopWindow(self.frame)
                return True
app = App()
app.MainLoop()

是的,我去掉if行以后,是反缩进的,而且事实上也执行了那个frame,我的问题不是在这里,在于为什么加上if行就不能显示该frame,而且书里说的if行的技巧到底指的是啥意思。谢谢~


[Copy to clipboard] [ - ]
CODE:
import wx

class Frame(wx.Frame):
        pass

class App(wx.App):
        def OnInit(self):
                self.frame = Frame(parent = None, title = "spare")
                self.frame.Show()
                self.SetTopWindow(self.frame)
                return True
#if __name__ == '__main__':
app = App()
app.MainLoop()

可以执行啊。不知道你怎么反缩近的?

if trick就是说,一个模块可以有两种方式来运行,一种是直接运行,一种是导入运行。直接运行是说要么这个程序是主程序,就是需要这样,要么直接运行是为了运行测试程序。因此为了区分两种运行状态,通过判断

[Copy to clipboard] [ - ]
CODE:
if __name__ == '__main__':

就可以知道是直接运行还是导入运行了。可以把启动或测试代码写在if后面。这样作为模块导入时就不会运行它们。
那么这个if行前面要不要加上'#'符号?加了就是注解项,不加呢?
如果是加了是可以运行,那如果变成了注解项的话,如何成为测试程序呢?
我把if注释掉是为了演示没有if时如何运行。如果去掉#号,if后面两句自然要缩近才可以的。当然是加上了if,没有注释才可以测试啊。