zoukankan      html  css  js  c++  java
  • Python零碎(一)

    Python中的__name__和__main__含义详解

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

    1 def main():
    2     ......
    3  
    4 if __name == "__main__":
    5     main();

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

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

    __name__和__main__

    __name__:

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

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

    __main__:

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

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

    代码示例:

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

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

    1 test: square(42) == 1764

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

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

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

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

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

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

    然后运行结果是:

    1 test: square(42) == 1764
    2 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执行的是否正确:

    1 test: square(42) == 1764

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

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

    其中的__main__,就是:

    作为模块mymath.py本身:

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

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

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

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

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

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

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

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

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

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

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

    1 app = QtWidgets.QApplication(sys.argv)  #  首先必须实例化QApplication类,作为GUI主程序入口
    2 
    3 aw = MainWindows()    # 实例化QtWidgets.QMainWindow类,创建自带menu的窗体类型QMainWindow
    4 aw.setWindowTitle("QMainWindow demo")   # 设置窗口标题
    5 aw.show()   # 显示窗体
    6 sys.exit(app.exec_())   #当来自操作系统的分发事件指派调用窗口时,应用程序开启主循环(mainloop)过程,当窗口创建完成,需要结束主循环过程,这时候呼叫sys.exit()方法来,结束主循环过程退出,并且释放内存。为什么用app.exec_()而不是app.exec()?因为exec是python系统默认关键字,为了以示区别,所以写成exec_   
  • 相关阅读:
    代码的完整性:调整数组顺序使奇数位于偶数前面
    《Java编程思想》笔记 第十一章 持有对象
    《Java编程思想》笔记 第十章 内部类
    《Java编程思想》笔记 第九章 接口
    《Java编程思想》笔记 第八章 多态
    《Java编程思想》笔记 第七章 复用类
    《Java编程思想》笔记 第六章 访问权限控制
    《Java编程思想》笔记 第五章 初始化与清理
    Java 的初始化顺序
    《Java编程思想》笔记 第四章 控制执行流程
  • 原文地址:https://www.cnblogs.com/laoniubile/p/5912231.html
Copyright © 2011-2022 走看看