python全栈闯关--20-模块和包

模块

mymoudle

# -*- coding:utf-8 -*-
print('form my_moudle.py')

money=1000

def read1():
    print("my_moudle read1",money)

def read2():
    print("my_moudle read2")

def change():
    global money
    money = 0

1、使用import导入模块

import sys
import my_module
import my_module
import my_module
import my_module
print(sys.path)
print(sys.modules.keys())

导入模块,会按照当前路径,pytchon解释器的方式去寻找包的路径。

多次导入包,不会重复导入。会根据sys.mmodules里面的值进行判别,包是否已经导入。

money=10
print(m.money)
print(money)

包有自己的命名空间,不与当前目录冲突

def read1():
    print('this is in main')

read1()
m.read1()

函数也不与当模块中冲突

m.change()
print(money)
m.read1()

虽然moudle中,定义了全局变量,但是修改的还是moudle中的值。

导入模块时,第一步,创建模块的命名空间,如果定义了global,引用的依然是命名空间中的模块;

第二部,执行模块中的代码

使用import as 别名来导入模块

导入后,可以使用别名来进行操作,以到达简化代码的目的。

可以通过参数,判断导入不同的参数,简化代码

2、from import

from my_module import read1
def read1():
    print('this is in main')
money = 10
read1()

本函数中的read1覆盖了导入的read1

from my_module import read1
# def read1():
#     print('this is in main')
money = 10
read1()

虽然修改了本模块中的money,但是调用的依然是my_module中的值

from my_module import read1
from my_module import read2
def read1():
    print('this is in main')
# money = 10
# read1()

read2()

read2中引用了read1,执行结果使用的money依然是模块中的money

__all__参数

__all__参数与from import * 组合使用,用于过滤导入的数据。只有子all中的函数、变量才会被导入

from my_module import *
print(read1)
print(read2)
print(money)
print(change)

没加all参数前,可以导入全部函数、变量

在module中添加all参数后

__all__ = ['read1', 'read2']

```

<function read1 at 0x000001F2D1CBE0D0>
<function read2 at 0x000001F2D1CBE1E0>
print(money)
NameError: name 'money' is not define

```

就只导入了read1和read2

import time,day21.imlib as i
import importlib
time.sleep(30)
importlib.reload(i)
i.func1()

如果导入包后,修改了模块,结果不会反应到已经加载的模块中,此时,就需要使用importlib来重新加载包。

如上例子中,如果在休眠的30秒内,修改了imlib,最终执行的不会是罪行的imlib。

使用importlib.reload重新加载后,更新到最新的代码。

猜你喜欢

转载自www.cnblogs.com/zxw-xxcsl/p/12665960.html