模块化编程(二)

模块的导入

经常有这样一句话:“不要重复造轮子”,知道别人已经造好了轮子,并且轮子也好用,那就直接拿别人的轮子来用,此处的“模块导入”就是“拿别人的轮子过来”。前文提到模块化编程的好处之一就是“代码复用性高”。写好的模块可以被反复调用,模块的导入就是“在本模块中使用其它模块”。

写文章-CSDN创作中心icon-default.png?t=N7T8https://mp.csdn.net/mp_blog/creation/editor/140068975

import语句导入

import语句基本格式如下

import 模块名
import 模块1,模块2...    # 导入多个模块
import 模块名 as 模块别名    # 导入模块并给导入的模块取个名字

import加载的模块分为4类:

  1. 使用Python编写的 .py 文件
  2. 已被编译为共享库或DLL的C或C++扩展
  3. 一组模块的包
  4. 使用C编写并链接到Python解释器的内置模块 

通过import语句实现导入和使用模块时,本质上是使用了内置函数 __import__(),Python解释器进行执行,最终会生成一个 module类 对象,这个对象就代表了被加载的模块,且被其引用。因此,我们通过import语句导入多个模块时,本质上也就是生成多个 module类对象,而给模块起个别名本质上就是新创建一个变量引用加载的模块对象。

注意:导入多个相同模块时,只有一行语句会生效,其他的都没用。

示例代码如下

import os.path

print(id(os.path))
print(type(os.path))

代码运行结果

1749657667760
<class 'module'>

Process finished with exit code 0

 from...import导入

基本语法格式如下

form 模块名 import 成员1,成员2[,...]    #导入要用的成员1,成员2[,...]
form 模块名 import *                   #导入一个模块中所有成员

注意:尽量避免 from 模块名 import * 这种写法,因为这会导入该模块中所有不是以下划线_开头的名字全都导入当前位置。因为模块中有很多属性,很有可能导入的属性和其他属性同名,从而发生命名冲突,而且代码可读性极差。

示例代码如下

from math import pi

print(pi)

代码运行结果

3.141592653589793

Process finished with exit code 0

import 语句 和 form...import语句的区别 

import 导入的是模块,from...import语句导入的是模块中的函数或类。在使用import语句导入的模块时要加 模块名,而在使用 from...import语句导入时则可以直接用函数或类名。

示例代码如下

首先定义一个Calculate.py文件,在文件中输入下面代码

"""一个简单的计算器"""

def add(*nums):
    total = 0
    for num in nums:
        total+=num
    print(f"计算的总和为:{total}")
    return total

def minus(a,b):
    print(f"{a}-{b}={a-b}")
    return a-b

class MyCalculate():
    def print_all(self,num):
        print(num)

再定义一个用于测试的 .py文件,输入下面代码

import Calculate

print(Calculate.add(1,2,3))
print(Calculate.minus(3,2))
------------------------------------------------------------------------
# 上面代码等价于下面代码
from Calculate import add,minus

print(add(1,2,3))
print(minus(3,2))

代码运行结果

计算的总和为:6
6
3-2=1
1

Process finished with exit code 0

import加载底层原理

__import__()动态导入

import语句本质上就是调用内置函数 __import__(),可以给 __import__()动态传递不同的参数值,就能导入不同的模块。

示例代码如下

s = "math"
m = __import__(s) #导入模块math并将其引用赋给m
print(m.sqrt(9))
print(m.pi)

代码运行结果

3.0
3.141592653589793

Process finished with exit code 0

注意:一般不建议使用 __import__(),因为它在Python2和Python3中有差异,可能会导致意外错误。

模块的加载问题

当导入一个模块时,模块中的代码都会被执行。不过,如果再次导入改模块,则不会再次执行。因为导入模块更多的时候需要的是模块中定义的变量、函数、对象等。因此,一个模块无论导入多少次,这个模块在整个解释器进程内有且仅有一个实例对象。

重新加载

若有时候确实需要重新加载模块,可以用:importlib.reload()方法。

示例代码如下

import Calculate
import importlib

importlib.reload(Calculate)
  • 20
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邂逅自己

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值