本文共 3296 字,大约阅读时间需要 10 分钟。
python __init__.py __name__ __doc__ __file__ argv[0] 浅析:
1》__init__.py
在eclipse PyDev 某个工程下创建文件夹和包的区别:包中含有__init__.py文件, 而文件夹中没有__init__.py文件,将包中的__init__.py文件复制到文件夹中,文件夹就变成了包, 可见包和文件夹只差了一个__init__.py文件。2》内建变量__name__(用来判断当前文件是否为主文件)
__name__属性 用于判断当前模块是不是程序入口, 如果当前程序正在使用(即该模块被直接执行),__name__的值为__main__。 如果模块是被导入当前程序,则该模块中的__name__的值是该模块的名字下面用到了haha.py文件和other.py文件,二者间的关系如下图:
folder包和main包以及other.py文件都位于python day03工程内。。。
haha.py文件:#!/usr/bin/env python#coding:utf-8def foo(): bar() print 'foo()','this is foo function!' def bar(): print 'bar()','this is bar function!'print __name__if __name__=='__main__': foo()else: print 'goodbye!'执行该文件,结果如下: __main__ #执行haha.py文件,__name__的值是'__main__',if语句后的条件为真,转去调用foo函数 bar() this is bar function! foo() this is foo function!
other.py文件:
#!/usr/bin/env python#coding:utf-8print __name__from folder import haha执行该文件,结果如下: __main__ #执行other.py文件,该文件中的__name__的值是'__main__' folder.haha #haha模块被导入到other.py文件中,haha.py文件中的__name__的值是'folder.haha' goodbye! #haha.py文件中的__name__的值是'folder.haha',因此if语句后的条件为假,所以打印出'goodbye!'
3》__doc__属性
模块,类,函数本身是一个对象,而每个对象都会有一个__doc__属性。该属性用来描述该对象的作用。 如下程序:#!/usr/bin/env python#coding:utf-8'''This is my first python program!'''class myClass: '''This is my first class!''' def printf(): '''print some information!''' print 'hello python!'def myFun(): '''This is my first function!''' print 'hello world!'print __doc__ #输出该python文件的说明信息print globals()['__doc__']#该语句与上一条语句作用一样print myClass.__doc__ #输出myClass类的说明信息print myClass.printf.__doc__ #输出成员函数printf的说明信息myFun()#调用 myFun函数print myFun.__doc__ #输出函数myFun的说明信息运行程序,输出结果: This is my first python program! This is my first python program! This is my first class! print some information! hello world! This is my first function! 4》__file__ 与argv[0] 在python下,获取当前执行主脚本的方法有两个:sys.argv[0]和__file__ 获取主文件路径的最佳方法是用sys.argv[0],内建变量__file__ 也可用来获得模块所在的路径。 比如在脚本test.py中写入:
#!/usr/bin/env python#coding:utf-8'''This is my first python program!'''import sysprint sys.argv[0]print __file__4.1>按相对路径./test.py来执行,则打印得到的是相对路径: E:\workspace\python day03\main>python ./test.py ./test.py ./test.py E:\workspace\python day03\main> 4.2>按绝对路径执行则得到的是绝对路径:(由于该绝对路径中包含空格,需要加上双引号,否则会找不到文件) C:\Users\91135>python "E:\workspace\python day03\main\test.py" E:\workspace\python day03\main\test.py E:\workspace\python day03\main\test.py C:\Users\91135> 综上所述,argv[0]和__file__得到的可能是相对路径,也可能是绝对路径, 为了确保得到绝对路径, 可以使用os.path.realpath()或 os.path.abspath() 如下python代码:
#!/usr/bin/env python#coding:utf-8'''This is my first python program!'''import sys,os#以下2句,若按相对路径执行,得到的是相对路径,若按绝对路径执行,得到的是绝对路径print sys.argv[0]print __file__#以下4句能够确保得到的是绝对路径print os.path.abspath(sys.argv[0])print os.path.realpath(sys.argv[0])print os.path.abspath(__file__)print os.path.realpath(__file__)运行结果: E:\workspace\python day03\main>python ./test.py ./test.py #按相对路径./test.py来执行,则打印得到的是相对路径 ./test.py #同上 E:\workspace\python day03\main\test.py E:\workspace\python day03\main\test.py E:\workspace\python day03\main\test.py E:\workspace\python day03\main\test.py E:\workspace\python day03\main> 注意:在Python控制台下,直接使用print __file__是会导致错误: NameError: name '__file__' is not defined 因为这时没有在任何一个脚本下执行,自然没有 __file__的定义了。 同理,直接使用 print argv[0]也会报错:NameError: name 'argv' is not defined
(完)