Python中的包和模块

目录

简介

导入模块

示例

导入时换行

.pyc文件

__init__.py

示例

批量导入

Tips

循环导入示例


简介

从物理表现上来说:

包:文件夹

模块:文件

一个文件夹下包含__init__.py文件,则成为一个package 。

__init__.py本身是一个模块,这个模块的名字就是它的包名。

导入模块

  • import 模块名
  • from 模块名 import 具体(变量/函数/类名...)
  • from 模块名 import *
  • from 包名 import 模块

示例

目录结构

  • 在c8.py中导入t文件夹中的c4.py中的变量a,三种方法。

注意第二种,如果直接使用“import t.c4”,在使用变量a的时候需用t.c4.a。

#方法一
from t import c4
print(c4.a)

#方法二
import t.c4
print(t.c4.a)

import t.c4 as m
print(m.a)

#方法三
from t.c4 import a
print(a)

from t import c4
print(c4.a)

from t.c4 import *
print(a)

tips:

在c4.py文件中加入内置变量__all__ = ['a','c'],可以指定当使用'import *'时可以导入的元素(这里只能导入变量a和c)。

# c4.py
__all__ = ['a','c']
a = 2
b = 3
c = 4

#c8.py
from t.c4 import *
print(a)
print(c)
print(b)

#执行结果:
> python c8.py
2
4
Traceback (most recent call last):
  File "E:\word\Python\code\abc\c8.py", line 8, in <module>
    print(b)
NameError: name 'b' is not defined

导入时换行

#方法一
from t.c4 import a, b, \
    c

#方法二
from t.c4 import (a, b,
    c)

.pyc文件

python解释器所编译的字节码文件,可以提升python程序的运行效率。

__init__.py

当一个包被导入时,__init__.py文件将首先被自动执行。

在__init__.py文件里,可以通过变量 "__all__ = ['c4']" 指定当使用 * 时,可以导出的模块名(即使用import *时,能导入的模块名)。

示例

目录结构:

#__init_.py文件
__all__=['c4']

#c8.py文件
from t import *
print(c4.a)
print(c5.e)
#执行结果:
> python c8.py
2
Traceback (most recent call last):
  File "E:\word\Python\code\abc\c8.py", line 8, in <module>
    print(c5.e)
NameError: name 'c5' is not defined

批量导入

当需要多次导入同一个模块时,可以在__init__文件中导入。

Tips

  • 包和模块不会被重复导入(性能问题)。
  • 避免循环导入。

循环导入示例

目录结构:

情况1:直接的循环导入

#p1.py
from p2 import p2
p1=2
print(p2)

#p2.py
from p1 import p1
p2=2

执行p1.py文件会报错:

原因是执行p1.py文件时,“from py2”会让python执行p2.py文件,而p2.py中又导入了p1模块,这样就构成了循环导入。 

> python p\p1.py
Traceback (most recent call last):
  File "E:\word\Python\code\abc\p\p1.py", line 1, in <module>
    from p2 import p2
  File "E:\word\Python\code\abc\p\p2.py", line 1, in <module>
    from p1 import p1
  File "E:\word\Python\code\abc\p\p1.py", line 1, in <module>
    from p2 import p2
ImportError: cannot import name 'p2' from partially initialized module 'p2' (most likely due to a circular import) (E:\word\Python\code\abc\p\p2.py)

情况2:间距循环导入

#p1.py
from p2 import p2
p1=2
print(p2)

#p2.py
from p3 import p3
p2=2

#p3.py
from p1 import p1
p3=2

执行p1.py文件报错:

> python p\p1.py
Traceback (most recent call last):
  File "E:\word\Python\code\abc\p\p1.py", line 1, in <module>
    from p2 import p2
  File "E:\word\Python\code\abc\p\p2.py", line 1, in <module>
    from p3 import p3
  File "E:\word\Python\code\abc\p\p3.py", line 1, in <module>
    from p1 import p1
  File "E:\word\Python\code\abc\p\p1.py", line 1, in <module>
    from p2 import p2
ImportError: cannot import name 'p2' from partially initialized module 'p2' (most likely due to a circular import) (E:\word\Python\code\abc\p\p2.py)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值