IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

为什么python里要 if __name__ == ‘__main__’:

I am LAZY bones ? 2010-06-01 09:59:21 累计浏览 8,414 次
本机暂存

尽管python允许你像shell脚本一样,把大段的代码堆积着写,但是,很多python入门的书,都会建议你把代码写成一个函数,然后在最后面统一调用,例如这样:

def main():
    #具体代码
 
if __name__ == '__main__':
    main()

很多文章都会说这个是由于代码风格之类的原因,但是其实,不这样写,有时候也是会直接导致出错的。
举个例子,打开《A Byte of Python》的类变量那节,可以这里看在线版本,然后把中间的那示例代码复制下来,运行,可以看到,确实能得到预期正确的结果。
但是,现在把那代码里的所有“swaroop”换成“xxx1”,再把所有“kalam”换成“yyy1”,再运行,就会在程序运行的最后时刻,得到这么一个奇怪的错误(Python 2.6.5下实验):
Exception AttributeError: "'NoneType' object has no attribute 'population'" in > ignored
也就是说,换了个变量名,程序就出错了。。。
究其原因,应该是python在最后析构所有类和对象的时候,并没有处理这些对象之间的依赖关系,而是根据变量名来决定某种顺序操作了。从而导致Person类本身,先于yyy2被干掉了,所以在解构yyy2的时候,执行它的__del__()方法,却发现父类都已经没有了~~
这应该确实算是python解析器的bug,但是,如果那把这个例子里的所有class Person以外的代码,写到一个main()函数里,再通过上述方法调用的话,就不会发生这种错误了。
所以,大家最好还是别太在意多几行代码,养成这个好习惯吧。

要深究此错误的原因,可以看官方文档里的描述,并在这里讨论。

同分类推荐文章

  1. 重构:AI 时代的代码进化 (2026-06-28 17:30:00)
  2. Goal Workflow:目标驱动的研发闭环 (2026-06-28 11:30:00)
  3. 科技爱好者周刊(第 401 期):如何赚到10亿美元 (2026-06-26 08:05:38)

查看更多 开发者 文章 →

建议继续学习

  1. 用Hyer来进行网站的抓取 (累计阅读 158,255)
  2. 配置Nginx+uwsgi更方便地部署python应用 (累计阅读 107,179)
  3. 程序员技术练级攻略 (累计阅读 35,499)
  4. python实现自动登录discuz论坛 (累计阅读 32,848)
  5. python编程细节──遍历dict的两种方法比较 (累计阅读 20,372)
  6. 每个程序员都应该学习使用Python或Ruby (累计阅读 17,926)
  7. Chrome和goagent的配置方法,你懂的 (累计阅读 16,848)
  8. 30分钟3300%性能提升――python+memcached网页优化小记 (累计阅读 13,745)
  9. 使用python爬虫抓站的一些技巧总结:进阶篇 (累计阅读 13,309)
  10. 我的PHP,Python和Ruby之路 (累计阅读 13,153)