模块Module
一个.py
文件就是一个Module
一个目录下面有__init__.py
的目录就是一个包
mycompany
├─ web
│ ├─ __init__.py
│ ├─ utils.py
│ └─ www.py
├─ __init__.py
├─ abc.py
└─ utils.py
- 其中
__init__.py
模块就是指包名的模块mycompany.py
mycompany.abc.py
模块为mycompany.abc
作用域
__xxxx__
特殊变量可以直接引用
_xxx
或 __xxx
为private
变量、函数
def _private_1(name):
return 'Hello, %s' % name
def _private_2(name):
return 'Hi, %s' % name
def greeting(name):
if len(name) > 3:
return _private_1(name)
else:
return _private_2(name)
private函数和变量 不应该被直接引用
可以通过public函数间接引用
外部不需要引用的函数全部定义成private
,只有外部需要引用的函数才定义为public
**__name__
和__main__
**的用法
- 先定义testmodule.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' a test module '
def addFunc(a,b):
return a+b
print('testmodule计算结果:',addFunc(1,1))
- 再定义一个anothertestmodule.py 调用testmodule模块
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' a test module '
import testmodule
print('调用anothermodule模块执行的结果是:',testmodule.addFunc(12,23))
- 此时运行anothermodule.py,得到
C:\work> python anothertestmodule.py
testmodule计算结果: 2 # testmodule模块被调用执行
调用test模块执行的结果是: 35
- 但是如果修改testmodule.py,加上
__name__
==__main__
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' a test module '
def addFunc(a,b):
return a+b
if __name__ == '__main__':
print('testmodule计算结果:',addFunc(1,1))
此时运行anothermodule.py,得到
C:\work> python anothertestmodule.py
调用test模块执行的结果是: 35
主要原因在于当调用一个module
时,此时的__name__
取值为模块的名字,所以if判断为假,不执行后续代码。此时__main__
的函数入口为anothermodule
而非testmodule