python __init__.py __name__ __doc__ __file__ argv[0] 浅析

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文件,二者间的关系如下图:

python __init__.py __name__ __doc__ __file__ argv[0] 浅析_第1张图片

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!'
执行该文件,结果如下:
__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-8
print __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 sys
print 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

(完)


你可能感兴趣的:(python)