Python中的__name__和__main__含义详解

在写Python代码和看Python代码时,我们常常可以看到这样的代码:

 def main():
...... if __name == "__main__":
main();

其中的函数名main,也可以是其他任意的,你所设置的名字。

这里,就出现了,我们此处所要解释的

__name__和__main__

__name__:

如果是放在Modules模块中,就表示是模块的名字;

如果是放在Classs类中,就表示类的名字;

__main__:

模块第一次被导出(import)后,系统会自动为其创建一个域名空间(namespace);

(模块,都是有自己的名字的)此处的脚本的主模块的名字,始终都叫做__main__。

代码示例:

 #!/usr/bin/python
# -*- coding: utf-8 -*-
"""
【整理】Python中的__name__和__main__含义详解
http://www.crifan.com/python_detailed_explain_about___name___and___main__ Version: 2012-11-17
Author: Crifan
Contact: http://www.crifan.com/contact_me/
""" def square(x):
return x * x print "test: square(42) ==",square(42);

对应的,运行结果也是很正常的:

 test: square(42) == 1764

但是呢,往往我们所见到的,和我们以后自己也会遇到的,自己写的,有条理的,可复用的做法,那肯定是

那对应的square等函数,专门放到一个文件中,然后被别人调用,此时,就是这样的:

对应的模块文件是mymath.py,里面有我们实现的函数square:

 #!/usr/bin/python
# -*- coding: utf-8 -*-
"""
【整理】Python中的__name__和__main__含义详解
http://www.crifan.com/python_detailed_explain_about___name___and___main__ Version: 2012-11-17
Author: Crifan
Contact: http://www.crifan.com/contact_me/
""" def square(x):
return x * x print "test: square(42) ==",square(42);

然后别的python文件__name___and___main__.py中,导入此mymath模块,然后使用其square函数:

 #!/usr/bin/python
# -*- coding: utf-8 -*-
"""
【整理】Python中的__name__和__main__含义详解
http://www.crifan.com/python_detailed_explain_about___name___and___main__ Version: 2012-11-17
Author: Crifan
Contact: http://www.crifan.com/contact_me/
""" import mymath; print "In caller, test for mymath: square(12)=",mymath.square(12);

然后运行结果是:

 test: square(42) == 1764
In caller, test for mymath: square(12)= 144

此处,我们看到了,也同时出现了,原本用于mymath.py中去测试square函数的打印结果:

test: square(42) == 1764

而这样的内容,很明显,是作为我模块的调用者,不希望看到的。也不关心的。

此时,我们所希望的是:

作为模块mymath.py本身,希望有自己的相关的调试的代码,用于调试自己模块函数,演示如何使用等等代码;

但是又不希望在被别的,本模块的调用者,所执行到,所看到;

此时,就可以用上述的__main__来实现了:

把mymath.py改为:

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
【整理】Python中的__name__和__main__含义详解
http://www.crifan.com/python_detailed_explain_about___name___and___main__ Version: 2012-11-17
Author: Crifan
Contact: http://www.crifan.com/contact_me/
""" def square(x):
return x * x if __name__ == "__main__":
print "test: square(42) ==",square(42);

此时:

1. 作为mymath.py本身,自己运行时,可以运行到此处的代码,调试,验证自己的函数square执行的是否正确:

 test: square(42) == 1764

2.同时,作为mymath.py的调用者__name___and___main__.py,在import mymath的时候,也不会看到对应的代码执行的结果了:

 In caller, test for mymath: square(12)= 144

其中的__main__,就是:

作为模块mymath.py本身:

作为脚本自己去运行的话,对应的模块名,就是上面所解释的,始终叫做__main__

关于这点,上述代码已经验证过了。因为mymath.py中的__name__,就是对应的,内置的变量,通过判断,的确是__main__,然后才会去执行到对应的模块的测试代码的。

如果被当做一个模块被别人调用的时候,对应的模块mymath.py的模块名,就是mymath;

关于这点,我们可以来验证一下,把__name___and___main__.py改为:

 #!/usr/bin/python
# -*- coding: utf-8 -*-
"""
【整理】Python中的__name__和__main__含义详解
http://www.crifan.com/python_detailed_explain_about___name___and___main__ Version: 2012-11-17
Author: Crifan
Contact: http://www.crifan.com/contact_me/
""" import mymath; print "In caller, test for mymath: square(12)=",mymath.square(12);
print "As module be imported, mymath module name=",mymath.__name__;

再去运行,就可以看到输出的结果是mymath了:

 In caller, test for mymath: square(12)= 144
As module be imported, mymath module name= mymath

=========================================

python 调用Qt Creator创建的ui文件:

 from PyQt4 import QtGui,QtCore,uic  # pyqt4版本
app=QtGui.QApplication(sys.argv)
qtCreatorFile='~~\demo\login.ui' #***.ui文件所在具体路径
loginui=uic.loadUi(qtCreatorFile) #通过ui文件路径调用ui文件
loginui.show() #显示控件
#该种引用方式属于直接调用和显示已经制作完毕的窗体控件,无法再对控件属性做进一步操作和修改。若要更改控件属性,需要将ui文件转换成代码文件,并将代码中控件属性变量修改为全局变量使得外部可以访问

PYQT5 GUI开发窗口类型QApplication的调用流程:

 app = QtWidgets.QApplication(sys.argv)  #  首先必须实例化QApplication类,作为GUI主程序入口

 aw = MainWindows()    # 实例化QtWidgets.QMainWindow类,创建自带menu的窗体类型QMainWindow
aw.setWindowTitle("QMainWindow demo") # 设置窗口标题
aw.show() # 显示窗体
sys.exit(app.exec_()) #当来自操作系统的分发事件指派调用窗口时,应用程序开启主循环(mainloop)过程,当窗口创建完成,需要结束主循环过程,这时候呼叫sys.exit()方法来,结束主循环过程退出,并且释放内存。为什么用app.exec_()而不是app.exec()?因为exec是python系统默认关键字,为了以示区别,所以写成exec_

Python零碎(一)的更多相关文章

  1. python零碎知识点一

    dir(object),列出对象所有可以用的的方法(参数可以为任意对象,例如class,func等) >>>dir('str') ['__add__', '__class__', ' ...

  2. [转]Python零碎知识(2):强大的zip

    一.代码引导 首先看这一段代码: 1 >>> name=('jack','beginman','sony','pcky') 2 >>> age=(2001,2003 ...

  3. python零碎知识点

    0.规范化 使用Ctrl+Alt+L可以将代码排列格式更加规范化 1.浮点数 1.23x109就是1.23e9或者12.3e8:0.000012可以写成1.2e-5 2.字符串 >>> ...

  4. 初学python - 零碎的知识点

    * 标识符命名规则 数字,字母,下划线组成,数字不能开头区分大小写 * 注释 单行:#:多行:‘ ‘ ‘ ,“”“: * 进制标识 b:二进制 o:八进制 d:十进制x:十六进制 转换:format( ...

  5. python --- 零碎

    1.匿名输出: lambda x : print(x))(100) #冒号前输入量 ,冒号后是输出量结果:100 2.导入调用其他python文件: test1.py #第一个python文件 def ...

  6. Python 零碎信息-基础 02

    1. range xrange 的差别 1.1 range 返回列表对象. 1.2 xrange 返回xrange对象  不需要返回列表里面的值, 节省内存. >>> range(1 ...

  7. Python 零碎信息-基础 01

    1. """ 可以插入多行文字. print """ abC 123' 456''" #单引号, 双引号, 也没有关系 " ...

  8. Python学习(26):Python函数式编程

    转自  http://www.cnblogs.com/BeginMan/p/3509985.html 前言 <core python programming 2>说: Python不大可能 ...

  9. 第四篇:python基础之杂货铺

    在这一篇中我们将对上几篇的Python零碎的知识进行补充,即字符串的格式化输出,以及深浅拷贝,接下来我们将对这两种进行一一介绍. 一.字符串格式化输出 关于字符串的格式化输出,我们需要了解为什么需要字 ...

随机推荐

  1. 将web容器置于OSGi框架下进行web应用的开发

    将web容器置于OSGi框架下,其实就是将web容器做成OSGi支持的Bundle,再安装到OSGi框架中,这里使用的是Jetty容器. 1.创建一个Eclipse插件项目,在此插件下创建一个WebR ...

  2. ASP.NET总结

    ASP.NET已经学习完.学牛腩的时候面对一些控件和方法会用,但对当中的原理还不懂.学习这部分的内容时, 从头到尾都有一种相识的感觉,把之前一些不懂得地方也理解了,每个知识都有相应的样例练习,学起来还 ...

  3. C#四舍五入保留一位小数

    DateTime d1 = hrStaff.DateJoin; DateTime d2 = DateTime.Now; TimeSpan d3 = d2.Subtract(d1); ; //int i ...

  4. hibernate中对象集合的保存

    一.在java web设计中经常使用对象进行操作,在hibernate中对象集合的保存(一对多) 1需要进行如下步骤: 1) 设计数据表关系 2)引入jar包,需要注意引入数据库connector 3 ...

  5. github提交一个空目录

    github默认不上传空目录,有的时候需要空目录来保持程序的结构. 二个小问题. 1.始终保持空目录,即时里面有文件,也全部忽略掉. 建立一个.gitignore文件放到空目录内. mkdir emp ...

  6. 关于搭配junit 和JUnit报initializationError的解决方法

    关于junit是什么就不复述了,网上有 junit的source code是可以下载的,各个版本都有 地址:https://github.com/junit-team 通过junit 的source ...

  7. table中添加下拉框

    { file: 'usename', title: '下发用户', width:"20%", align: 'center', templet: function (d) { va ...

  8. 不同classloader装载的类不能互相访问?

    一,有两个术语,一个叫“定义类加载器”,一个叫“初始类加载器”. 比如有如下的类加载器结构: bootstrap   ExtClassloader     AppClassloader     -自定 ...

  9. spring-boot 集合mybatis 的分页查询

    spring-boot 集合mybatis 的github分页查询 一.依赖包 <!-- mysql 数据库驱动. --> <dependency> <groupId&g ...

  10. 将多个文件夹内的txt合并

    import os import re def text_create(name): """ 创建txt文件夹 """ desktop_pa ...