module学习
Posted 一枚小菜鸟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了module学习相关的知识,希望对你有一定的参考价值。
详细参看:廖雪峰官方网站
1、例子引入
一个.py文件就是一个模块,采用模块便于代码维护
1 # -*- coding: utf-8 -*- 2 \'a test module\' 3 __author__=\'rainbow\' 4 import sys 5 def test(): 6 args=sys.argv 7 if len(args)==1: 8 print(\'Hello,world!\') 9 elif len(args)==2: 10 print(\'Hello,%s!\' % args[1]) 11 else: 12 print(\'Too many arguments!\') 13 14 if __name__==\'__main__\': 15 test()
运行结果:
分析:import sys:导入sys模块,sys作为对象指向sys模块,利用sys可以访问sys模块中的所有功能
第6行:sys模块中的args变量,存储了命令行的所有输入,即可以获取小黑框输入的东西,运行这个hello.py文件一定第一个参数是hello.py,后面可以自己加参数,所以下面if语句可以判断输入元素的个数
第14行:当采用import hello.py方式时,没有打印,因为此时没有执行test(),必须再采用hello.test()才行
2、作用域
在一个模块中定义的变量和函数,如果只想在该模块内部使用,不希望被外部调用,可以采用_xx或__xx这种形式,这种函数或者变量是非公开的(private),不应该被直接引用(不是不能被引用),但是习惯上不要直接引用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)
外部只需要greeting函数,不需要了解里面的_private_1和_private_2,所以可以定义为private形式
3、关于__name__==\'__main__\'中name的解释
测试模块nametestmudel.py
# -*- coding:utf-8 -*- #关于__name__==\'__main__\'中name的测试模块 \'name test module\' def addFunc(a,b): return a+b print(\'test计算结果:\',addFunc(1,1))
调用模块nametest.py
# -*- coding:utf-8 -*- #关于__name__==\'__main__\'中name的测试模块的调用模块 \'test\' import nametestmudel print(\'调用本模块执行的结果是:\',nametestmudel.addFunc(12,23))
运行结果:
分析:此时y模块中import 模块x时,先执行了x中的代码,然后在y中也会调用x中的函数,所以两个结果,而且不一样
当加上if __name__==\'__main__\'可以看出import时__name__会改变,当直接调用一个模块时,__name__==\'__main__\',但是当这个模块被import嵌入进其他模块中时,这个模块中的__name__就是这个模块的名字,而不再是__main__。例如以下代码:
# -*- coding:utf-8 -*- #关于__name__==\'__main__\'中name的测试模块 \'name test module\' def addFunc(a,b): return a+b if __name__==\'__main__\': print(\'test计算结果:\',addFunc(1,1))
这个代码只是修改了nametestmudel.py的部分代码,增加了if语句,如果直接调用这个nametestmudel.py文件,__name__==\'__main__\' 。 但是因为nametest.py中import nametestmudel 所以运行nametest.py时,nametestmudel模块中的__name__==nametestmudel
两个文件再次修改为下面代码:
# -*- coding:utf-8 -*- #关于__name__==\'__main__\'中name的测试模块 \'name test module\' def addFunc(a,b): return a+b if __name__==\'__main__\': print(\'test计算结果:\',addFunc(1,1)) print(\'__name__ =\',__name__)
# -*- coding:utf-8 -*- #关于__name__==\'__main__\'中name的测试模块的调用模块 \'test\' import nametestmudel print(\'调用本模块执行的结果是:\',nametestmudel.addFunc(12,23)) print(\'__name__ =\',__name__)
运行结果:
采用if __name__==\'__main__\':,当自己是直接调用时,if后面的代码可以执行,当自己被其他模块调用时,if后面的代码不能直接执行,所以这样就可以用来做测试(自己测试一部分的代码,其他程序并不需要做这一部分)
以上是关于module学习的主要内容,如果未能解决你的问题,请参考以下文章