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-8
def 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!'
执行该文件,结果如下:
other.py文件:
#!/usr/bin/env python
#coding:utf-8
print __name__
from folder import haha
执行该文件,结果如下:
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的说明信息
运行程序,输出结果:
#!/usr/bin/env python
#coding:utf-8
'''This is my first python program!'''
import sys
print sys.argv[0]
print __file__
4.1>按相对路径./test.py来执行,则打印得到的是相对路径:
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__)
运行结果:
(完)