【有书共读01】《python学习手册》读书笔记十六

第22章  模块代码编写基础

学习目标:
深入讨论了模块编码工具的基础知识:
import和from语句,reload调用
知道from语句只多加了一个步骤,在文件导入之后,将文件的变量名复制出来,
学习reload如何不停止并重启python而使文件再次导入
命名空间
导入嵌套时会发生什么
探索文件转换为模块的命名空间的过程
学习from语句潜在的一些陷阱

模块的创建:
只要使用文本编辑器,把一些python代码输入至文本文件中,然后以".py"为后缀名进行保存,
任何此类文件都会被自动认为是python模块。
在模块顶层指定的所有变量名都会变成其属性,并且可以导出供客户端来使用。
例:
一个名为modulel.py的文件中输入以下语句,并将文件导入,就会建立一个拥有一个属性的模块对象,变量名是printer
def printer(x):
    print(x)
模块怎么命名都可以,但是如果打算将其导入,模块文件名应以.py结尾。
对于会执行但不会被导入的顶层文件而言,".py"从技术上来讲是可有可无的,但是每次都加上去,
可以确保文件类型更醒目,并允许以后可以导入任何文件。
因为模块名在python程序中会变成变量名,因此要遵循命名规则。

模块的使用:
import语句:
import module1
有三个目的:1.识别要被载入的外部文件  2.生成脚本中的变量  3.在文件加载后,用来引用模块对象

from语句:
from module1 import printer
from会把变量名复制到另一个作用域,所以他就可以让我们直接在脚本中使用赋值的变量名,而不需要通过模块
但是会导致变量名的重复,不好不好

from*语句:
from module1 import *
from的特殊形式:当我们使用*时,会取得模块顶层所有复了值的变量名的拷贝
例如:
from modile1 import *
printer('hello world')
>>> hello world    #输出
from*只是多加了一个步骤,把模块中所有变量名复制到了进行导入的作用域内

注意,模块的导入只发生一次;
在此导入的操作只会取出已经加载的模块对象
例如:
simple中的代码:
print('hello')
spam=1
------------
import simple
>>>hello
simple.spam
>>>1
simple.spam=2
import simple
simple.spam
>>>2

from会破坏命名空间的潜质(注意)

命名空间的嵌套:
导入不会使命名空间发生向上的嵌套,但会发生向下的嵌套
利用点好运算路经,可能深入到任意嵌套的模块中并读取其属性。例:
mod3.py:
x=3
--------
mod2.py:
x=2
import mod3
print(x,end=' ')
print(mod3.x)
--------
mod1.py:
x=1
import mod2
print(x,end=' ')
print(mod2.x,end=' ')
print(mod2.mod3.x)
---------
打开mod1之后输出:
2 3  #  mod2的x,然后是mod3的x
1 2 3   # mod1的x 然后是mod2的x  然后是mod3的x

但是我们可以强制重新导入(重载模块):reload
reload会强制加载的模块的代码重新载入并执行,此文件中新的代码赋值语句会在适当的地方修改现有的模块对象。
reload只能用在python中
reload基础:
例:
编写了一个changer.py
message="first version"
def printer():
    print(message)
这个模块建立两个变量名:
一个是字符串,另一个时函数;
import changer
changer.printer()
>>>first version
现在在另一个窗口编辑该模板文件:
改为:
message="after editing"
def printer():
    print('reloaded:'.message)
然后重载:
import changer
changer.printer()
>>>first version
from imp import reload
reload(changer)
<module 'changer' from 'changer.py'>
changer.printer()
>>>reloaded:after editing

模块重载的用处:
除了可以在交互式提示符号下重载(以及重新执行)模块外,
模块重载在较大的系统中也有用处,在重新启动整个应用程序的代价太大时,
例:必须启动时通过网络连接服务器的系统,就是动态重载的一个非常重要的应用场景。
通常情况下:重载是程序能够提供高度动态的接口。
python代码的修改,都不需要停止并重启。

#笔记##读书笔记#
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务