模块与包

一个python文件有两种用途:
  1、被当成程序运行
  2、被当做模块导入

模块:

1.import....

一个py文件就可以作为一个模块

模块的导入:直接导入文件的名字,不需要带着后缀

模块中的函数调用:模块名.函数名()

首次导入模块会发生3件事:

  1. 执行foo.py
  2. 产生foo.py的名称空间,将foo.py运行过程中产生的名字都丢到foo的名称空间中
  3. 在当前文件中产生的有一个名字foo,该名字指向2中产生的名称空间

包:包就是含有__init___.py 的文件夹

包的本质就是模块的一种形式,包可以被当做模块来导入导包的时候执行的是__init___.py 的文件夹

强调:

  1. 无论import 还是 from... import...导入的时候点的左边必须是包,否则就会报错
  2. 包A和包B同名模块也不会冲突,因为他们是来自不同的空间
  3. import导文件的时候产生名称空间的名字来源于源文件
  4. import导包的时候产生名称空间的名字来源于源文件包下的init,其实导包就相当于导文件

import 与 from..import..导模块:

  impot导入模块在使用时必须加前缀"模块."
    优点:肯定不会与当前名称空间中的名字冲突
    缺点:加前缀显得麻烦

import foo
print(foo.x)
print(foo.get)
print(foo.change)

  from ... import ...导入也发生了三件事
    1、产一个模块的名称空间
    2、运行foo.py将运行过程中产生的名字都丢到模块的名称空间去
    3、在当前名称空间拿到一个名字,该名字与模块名称空间中的某一个内存地址

from foo import x 
from foo import get
from foo import change

  from...impot...导入模块在使用时不用加前缀
    优点:代码更精简
    缺点:容易与当前名称空间混淆

from foo import x # x=模块foo中值1的内存地址
x=1111

  *:导入模块中的所有名字

name='egon'
from foo import *
print(name)

  # 起别名 as

from foo import get as g
print(g)

无论是import还是from...import在导入模块时都涉及到查找问题
  优先级:
  1、内存(内置模块)
  2、硬盘:按照sys.path中存放的文件的顺序依次查找要导入的模块

原文地址:https://www.cnblogs.com/zhenghuiwen/p/12587254.html