Python3基础-模块
一 、模块介绍
在Python中,一个.py文件就称之为一个模块。
文件名为XX.py模块名则是XX ,导入模块可以引用模块中已经写好的功能
使用模块的好处是:提高了代码的可维护性
模块一共三种:
- python 标准库 eg time、os
- 第三方模块
- 应用程序自定义模块
二、模块使用
没有特别注释,就说明demoA、demoB 在相同的文件目录下
2.1 import 语句
#文件名:demoA.py def demoA_test(): print("我是模块A的内容") demo_A='Hi,MY name is demoA' print(demo_A) class Foo: def func(self): print('from the func') a=1 if __name__ == '__main__': demoA_test()
在另外一个demoB.py文件引用demoA.py的功能
import demoA #引入模块 x=demoA.a #引用模块foo中变量a的值 赋值给当前名称空间中的名字 print("x =====:",x) demoA.demoA_test() #调用模块demoA的demoA_test函数 obj = demoA.Foo() #调用模块demoA的类Foo 来实例化, obj.func()
执行demoB.py文件的结果如下
x =====: 1 我是模块A的内容 Hi,MY name is demoA from the func
导入多个模块---一行导入,用逗号分隔开不同的模块
import module1,module2,...moduleN
导入多个模块---多行导入
import module1 import module2 ... import moduleN
2.2 from -import 语句
#文件名 demoA.py a=1 def demoA_test(): print("我是模块A的内容") demo_A='Hi,MY name is demoA' print(demo_A)
def demoA_glo(): global a a = 0 print("a====",a) class Foo: def func(self): print('from the func') if __name__ == '__main__': demoA_test()
在另外一个demoB.py文件引用demoA.py的功能
方法1:
from demoA import a,demoA_test,demoA_glo,Foo #将模块demoA中的a,demoA_test,demoA_glo导入当前名称空间 x=a #直接使用模块demoA中的a赋值给x print("x=====",a) a=10 demoA_test() #直接执行demoA的demoA_test函数 demoA_glo() #直接执行demoA的demoA_glo函数 当前文件有重名的,修改的仍然是源文件中的a obj=Foo() #直接执行demoA的类Foo 来实例化 obj.func() """ 执行结果 x===== 1 我是模块A的内容 Hi,MY name is demoA a==== 0 from the func """
方法2:
from demoA import * #将模块demoA中的所有名字都导入到当前执行文件的名称空间中,在当前位置可以直接使用这些名字 x=a #直接使用模块demoA中的a赋值给x print("x=====",a) a=10 demoA_test() #直接执行demoA的demoA_test函数 demoA_glo() #当前文件有重名的,修改的仍然是源文件中的a obj=Foo() #直接执行demoA的类Foo 来实例化 obj.func() """ 执行结果 x===== 1 我是模块A的内容 Hi,MY name is demoA a==== 0 from the func """
方法2 可以在自己的文件中定义__all__变量来控制*代表的意思
#demoA.py __all__ = ['x','demoA_test'] #该列表中所有的元素必须是字符串类型,每个元素对应demoA.py中的一个名字 a=1 def demoA_test(): print("我是模块A的内容") demo_A='Hi,MY name is demoA' print(demo_A) def demoA_glo(): global a a = 0 print("a====",a) class Foo: def func(self): print('from the func') if __name__ == '__main__': demoA_test()
执行结果如下:
from demoA import * #此时的* 只有a和demoA_test x=a #直接使用模块demoA中的a赋值给x print("x=====",a) a=10 demoA_test() #直接执行demoA的demoA_test函数 #demoA_glo() #不可用,报错NameError: name 'demoA_glo' is not defined #obj=Foo() #不可用,报错NameError: name 'Foo' is not defined """ 执行结果 x===== 1 我是模块A的内容 Hi,MY name is demoA """
2.3 as语法
源文件
a=1 def demoA_test(): print("我是模块A的内容") demo_A='Hi,MY name is demoA' print(demo_A) def demoA_glo(): global a a = 0 print("a====",a) class Foo: def func(self): print('from the func') if __name__ == '__main__': demoA_test()
import -as ;from - import as
import demoA as deA x= deA.a print("x---",x) """ 执行结果 x--- 1 """ from demoA import demoA_test as deA deA() """ 执行结果 我是模块A的内容 Hi,MY name is demoA """
2.4 不同目录的调用
1、同级目录下:
--pythonscript
|--demoA.py
|--demoB.py
在程序demoB.py导入demoA.py,是直接调用的
#import import demoA.py # from -import from demoA import *
2、调用子目录下的模块:
--pythonscript
|--test_module
|---demoA.py
|--__init__.py(空文件) python3.7.2 在pycharm是不需要创建__init__.py
|--demoB.py
在程序demoB.py导入demoA.py; 需要在test_module目录下创建空文件__init__.py->python3.7.2 在pycharm是不需要创建__init__.py
#from-import from demo_module.demoA import * demoA_test() """ 执行结果 我是模块A的内容 Hi,MY name is demoA """ #import import demo_module.demoA demo_module.demoA.demoA_test() """ 执行结果 我是模块A的内容 Hi,MY name is demoA """
3、调用上级目录下的模块:
--pythonscript
|--test_module
|---demoB.py
|--lib
|--demoC.py
|--__init__.py[空文件] python3.7.2 在pycharm是不需要创建__init__.py
|--demoA.py
demoB.py调用文件demoA.py和demoC.py
import sys sys.path.append('..') import demoA import lib.demoC #默认情况下python解析器会搜索当前目录、已安装的内置模块和第三方模 #sys.path.append('..') 新增上一级目录搜索 #sys.path.append() 也可以加自定义的搜索目录