Python22 模块详解 之 import本质

模块、包的定义

模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:模块的本质是为了实现一个功能),本质就是.py结尾的python文件 (文件名:test.py,对应的模块名:test)

包:用来打包多个模块(.py文件),本质就是一个目录(必须有__init__.py文件),如果想要导入一个包就是解释(执行)这个包下的__init__.py文件。

导入方法

导入模块:

import module_name   (导入所有)

指定导入:from module_name import * (导入所有);   

导入指定方法:from module_name import abc  

导入模块中的多个方法: from module_name import abc123,abc456

导入模块中的方法:import module_name.abc

导入模块中的变量:import module_name.name

导入多个模块:import module1_name, module2_name

导入后别名: from module1_name import logger as abc123 使用该方式导入的话,需要通过别名来调用,如abc123()

不建议通过from方式来调用函数,假如当前.py文件中有一个叫abc的方法函数,然后我们如果通过使用from module_name import *来调用的话那么,且调用过来的module_name模块中也有个叫abc的方法函数,那么在当前.py文件中来调用abc()函数时就会导致冲突。

如果使用import module_name就不同了,需要使用module_name.abc的方式才可以调用module_name模块的方法函数,即使当前.py文件中有同名的也不会冲突。

import本质

image_1c0be4u0l13cjqm01iv0fgca9v9.png-7.1kB

我们在test.py中import time这个模块,其本质意义就是将time模块中的代码解释一遍(运行一遍)然后赋值给一个变量,这个变量就是time

from time import strftime相当于将time模块中的strftime方法给解释了一遍然后放入test.py文件中。

通过from time import strftime方式相当于打开了time模块这个文件然后将strftime给导入到当前所在的test.py文件中,所以在调用的时候直接strftime就可以了

通过直接import time方式后,相当于将time中的代码赋值给了time,所以在当前test.py中调用的时候需要time.strftime才可以调用。

image_1c0bf3ler1fhg1s2bf7q1kc7i9m16.png-8.3kB
需要time.xxx才可以调用
image_1c0bf44011n5h16mm13opvam1j5v1j.png-13.1kB
直接调用即可

导入模块的本质:就是把python文件解释一遍。

导入包的本质:就是执行包下的init.py文件。

动态路径

1、方法(一)

image_1c0bhdifh1jvrgv1c2k1jm41gvg20.png-29.8kB
在新建的包中的init.py写一个print代码

image_1c0bhdv2b531vco1kqoi6aqv2d.png-46.4kB
test.py与q1这个包在同级目录,所以调用q1是没问题的,可以看到图中下面的执行结果。

image_1c0bhefbl95k9n91fl54sq1f4u2q.png-33.7kB

image_1c0bhelph1ti5dmmltlf6spl837.png-26.9kB
调用不同目录的模块

image_1c0bhf3591ecc3o0198cdq817io3k.png-12.3kB
可以看到无法直接调用不同目录的模块

image_1c0bhg1hu1vvu1sik197j158k1uj641.png-62.2kB
默认先从当前目录去找q1这个目录找,然后在去sys.path(图中圈起来的路径)这些个路径去找,找不到就会报错。
打印的sys.path路径可以看到是一个列表,在列表中没有q2这个目录的路径,所以会找不到for_test.py导致报错。

通过os模块来查看当前的绝对路径
image_1c0bhgkbhfh419bo1ul71kdk1nlq4e.png-14.3kB
image_1c0bhgqbb1ln852c1eu7pc5c6f4r.png-3.2kB
显示绝对路径,可以看到packet.py

print (os.path.dirname(os.path.abspath(__file__)))    

通过os.path.dirname获取(os.path.abspath(file)的目录
image_1c0bhht561e2ma8kkae159usbg58.png-2.7kB
目前只获取到了q1这个目录,在这个目录下找不到for_test模块

print (os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

多一个os.path.dirname来获取更上一级的目录
image_1c0bhj3nfl8pumqv8k17mi1j545l.png-2.6kB

image_1c0bhjgea1l5k1vo217udh5b1dev62.png-33.8kB
新建一个与q1同级的mian模块

image_1c0bhmmifeme1bfo1ppahim1v4c6f.png-54.9kB
之前讲过sys.path是列表形式,所以需要将动态新生成的路径加入到sys.path中

image_1c0bhn80a18vf1rvhsokso9s76s.png-14.8kB
通过Import main然后在调用,可以看到执行结果

#### 2.方法(二)
image_1c0bho4o21i2h1c1ap9815t71rsl79.png-82.9kB
通过同样的方式去调用for_test就出现问题了,这是因为for_test在q2这个目录中,不能直接使用import来导入

image_1c0bhoghr1ml07f4r0u1c8s9hk7m.png-75kB
需要通过from q2这个目录然后在import,也就是从q2这个包中导入模块。

3.方法(三)

image_1c0bhpljhj6n1m50c2h9361msc83.png-13.9kB
之前了解过import包就相当于import这个包下的init模块

image_1c0bhq0ot1u2m198u1cd4mf5rq58g.png-16.6kB
执行没有问题

image_1c0bhqb9u1l9g90e135afb59gp8t.png-32.9kB
在这个init模块下我们使用from . import for_test,也就是说在packet.py中去import q2就相当于调用了init.py,然后init又调用了for_test.py,所以上图中可以通过q2.for_test.login()来调用。

from 后面的那个符号 点 表示从init的当前目录(q2这个包目录)去import

导入优化

image_1c0bhreaskh28km1toc1foodll9a.png-10.5kB
定义aa模块

image_1c0bhrqul17ek7u4qd4h9llul9n.png-29.2kB
在bb.py中import aa,然后在bb.py中定义函数并调用aa模块中的方法(函数),不过这样调用的话,在bb.py中的每一个函数都需要先去找aa模块,然后再去找test()这个方法,被调用一次就需要找一次,如果调用次数多的话,就需要大量的重复性工作,这样运行程序相对会比较慢。

image_1c0bhs6de18fnvod164i1p0tomta4.png-29.3kB
使用from方法来导入,相当于把这个test()导入到bb.py文件中了,这样在调用test()这个函数的时候,直接就是从本程序中直接调用,相比上一种方式运行速度会快。

转载于:https://blog.51cto.com/daimalaobing/2046801

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值