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. Maven构建项目时index.jsp文件报错

    错误为:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 原 ...

  2. MySQL —— 如何快速对比数据?

    我们在MySql中想要对比下两个不同的实例上的数据并且找出差异,除了主键之外我们还要对比每一个字段,应该怎么做呢? 方案一:写一个程序将两个实例里面的每一行数据都分别取出来对比,但是耗时我们无法估计, ...

  3. ubuntu13.04如何修改保存屏幕亮度

    ubuntu13.04如何修改保存屏幕亮度    入手ubuntu两月有余,最初只是想装个ubuntu学习下linux,然后搞了个win7和ubuntu的双系统,最后干脆将win7干掉了,直接让ubu ...

  4. sqlserver学习笔记(四)—— 创建table表

    1.新建数据库TestDB 2.为TestDB数据库新建表UserInfo 创建名为UserInfo的表,包括以上字段,其中ID为主键并设置标识规范,Nation设置默认值“中国”. 为表格添加一些数 ...

  5. ACCESS与MSSQL比较:SQL语句关于时间格式使用的注意点

    ACCESS与MSSQL比较:SQL语句关于时间字符串的使用:ACCESS数据库使用 # 来控制时间格式字符串:mssql数据库使用单引号 ' 来控制时间格式字符串.例: ACCESS版本:UPDAT ...

  6. hibernate中对象集合的保存

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

  7. [Jobdu] 题目1390:矩形覆盖

    题目描述: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入 ...

  8. Bootstrap的js插件之折叠(collapse)

    data-toggle="collapse"--指明该元素具有折叠功能: data-target--设置元素打开折叠后指向的元素链接. .collapse--用来设置元素为折叠内容 ...

  9. Nmap速查手册

    http://drops.wooyun.org/tips/4333 From:http://highon.coffee/docs/nmap/ 0x00:说明 只是一个快速查询手册,理论的东西都没有补充 ...

  10. JqERY

    //下拉菜单样式 /*查找全部select的下拉菜单*/ function getElemsById(cot_val){ return document.getElementById(cot_val) ...