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. 解决Sping 框架 Controller@Value获取不到值

    原因:要获取 int.properties 中的数据 但是 一直拿不到值 如下代码 使用这种方式注入 *.properties文件 <!-- 引入配置文件 --> <context: ...

  2. 迭代器类vector::iterator 和 vector::reverse_iterator 的实现、迭代器类型、常用的容器成员

    一.迭代器 迭代器是泛型指针 普通指针可以指向内存中的一个地址 迭代器可以指向容器中的一个位置 STL的每一个容器类模版中,都定义了一组对应的迭代器类.使用迭代器,算法函数可以访问容器中指定位置的元素 ...

  3. windows上通过secureCRT和putty创建密钥登录

    前面介绍了linux的ssh远程登录协议和ssh无password登录方式.这里在windows下通过secureCRT和putty登录linux来看一下详细的密钥创建,配置和登录.也算做个备忘录吧. ...

  4. js获取当前域名的方法

    一.获取当前域名 1.方法一 var domain = document.domain; 2.方法二 var domain = window.location.host; 但是获取到的domain在线 ...

  5. mongoDB 简单使用

    mongodb传送门: # 第三方学习地址: http://blog.csdn.net/foruok/article/details/47746057 # 下载mongoDB https://www. ...

  6. js身份证验证算法

    var validateIdCard=function (id, backInfo) { var info={ y: "1900", m: "01", d: & ...

  7. Object-C中的数字对象

    #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { ...

  8. SQL命令查看Mysql数据库大小

    SQL命令查看Mysql数据库大小的方法. 要想知道每个数据库的大小的话,步骤如下:1.进入information_schema 数据库(存放了其他的数据库的信息)use information_sc ...

  9. mysql 主主复制(双主复制)报错Last_SQL_Errno: 1146

    Last_Errno: 1146 Last_Error: Error 'Table 'test.user' doesn't exist' on query. Default database: 'te ...

  10. 如何使用微信JS-SDK实际分享功能

    http://jingyan.baidu.com/album/d3b74d64c517051f77e609ed.html?picindex=7