Python 提供了一个办法,把这些定义存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件被称为模块。
模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 python 标准库的方法。
想使用 Python 源文件,只需在另一个源文件里执行 import 语句,语法如下:
import module1[, module2[,... moduleN]
#support.py 文件代码 def print_func( par ): print ("Hello : ", par) return #test.py 引入 support 模块: #test.py 文件代码 # 导入模块 import support # 现在可以调用模块里包含的函数了 support.print_func("Runoob") 输出结果: Hello : Runoob
一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。
Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中,语法如下:
from modname import name1[, name2[, ... nameN]]
# 斐波那契(fibonacci)数列模块 def fib(n): # 定义到 n 的斐波那契数列 a, b = 0, 1 while b < n: print(b, end=‘ ‘) a, b = b, a+b print() def fib2(n): # 返回到 n 的斐波那契数列 result = [] a, b = 0, 1 while b < n: result.append(b) a, b = b, a+b return result #例如,要导入模块 fibo 的 fib 函数,使用如下语句: from fibo import fib, fib2 fib(500) 输出结果: 1 1 2 3 5 8 13 21 34 55 89 144 233 377
这个声明不会把整个fibo模块导入到当前的命名空间中,它只会将fibo里的fib函数引入进来。
from 模块名 import 函数名/类名 as 简称
什么时候用as?
1、函数或者类的名字太长了
2、不同的模块中有重名的函数/类
把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:
from modname import *
一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。
说明: 每个模块都有一个__name__属性,当其值是‘__main__‘时,表明该模块自身在运行,否则是被引入。
说明:__name__ 与 __main__ 底下是双下划线, _ _ 是这样去掉中间的那个空格。
内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回:
import sys dir(sys) 输出结果: [‘__displayhook__‘, ‘__doc__‘, ‘__excepthook__‘, ‘__loader__‘, ‘__name__‘, ‘__package__‘, ‘__stderr__‘, ‘__stdin__‘, ‘__stdout__‘, ‘_clear_type_cache‘, ‘_current_frames‘, ‘_debugmallocstats‘, ‘_getframe‘, ‘_home‘, ‘_mercurial‘, ‘_xoptions‘, ‘abiflags‘, ‘api_version‘, ‘argv‘, ‘base_exec_prefix‘, ‘base_prefix‘, ‘builtin_module_names‘, ‘byteorder‘, ‘call_tracing‘, ‘callstats‘, ‘copyright‘, ‘displayhook‘, ‘dont_write_bytecode‘, ‘exc_info‘, ‘excepthook‘, ‘exec_prefix‘, ‘executable‘, ‘exit‘, ‘flags‘, ‘float_info‘, ‘float_repr_style‘, ‘getcheckinterval‘, ‘getdefaultencoding‘, ‘getdlopenflags‘, ‘getfilesystemencoding‘, ‘getobjects‘, ‘getprofile‘, ‘getrecursionlimit‘, ‘getrefcount‘, ‘getsizeof‘, ‘getswitchinterval‘, ‘gettotalrefcount‘, ‘gettrace‘, ‘hash_info‘, ‘hexversion‘, ‘implementation‘, ‘int_info‘, ‘intern‘, ‘maxsize‘, ‘maxunicode‘, ‘meta_path‘, ‘modules‘, ‘path‘, ‘path_hooks‘, ‘path_importer_cache‘, ‘platform‘, ‘prefix‘, ‘ps1‘, ‘setcheckinterval‘, ‘setdlopenflags‘, ‘setprofile‘, ‘setrecursionlimit‘, ‘setswitchinterval‘, ‘settrace‘, ‘stderr‘, ‘stdin‘, ‘stdout‘, ‘thread_info‘, ‘version‘, ‘version_info‘, ‘warnoptions‘]
软件开发过程中可以通过目录来组织模块,这种方法叫做包。
对模块进行分组
可以以如下方式对模块进行组织:
1、创建一个目录
2、在该目录下创建一个__init__.py文件
3、在该目录下创建模块
import 包名.模块名 from 包名.模块名 import 函数/类
自定义的 模块的名字和 系统模块的名字冲突的时候:导包的时候最后导的自定义的。
自定义模块的时候尽量不要名字和系统模块的名字一样。
我怎么知道系统有没有这个模块?
一招可以解决冲突问题:导包的时候指定路径
原文:https://www.cnblogs.com/-Leif/p/12779123.html