第二十二章 模块代码编写基础

#1.
#A:因为模块名在python中会变成变量名,因此模块名需要遵守python的命名规则,否则无法将其导入(定义一个if.py,则无法导入)
#B:当一个模块被导入的时候,python会把内部模块名映射到外部文件名,会将模块搜索路径中的目录路径加在前面,而.py或者其他后缀名加在后面
#C:import会读取整个模块,所以必须进行定义后才能读取它的变量名,from会将变量名复制到另一个作用域,所以她就可以让我们直接使用复制后的变量名而不需要通过模块
#D:from语句其实只是稍稍扩展了import语句而已,她照常导入了模块文件,但是多了一个步骤:将文件中的一个或多个变量名从文件中复制了出来
#E:from*,会取得模块顶层所有赋值了的变量名的拷贝,也是照常导入了模块文件,但是多了复制所有变量到导入的作用域之内的步骤

#2.
‘‘‘
就像def一样,import和from是可执行语句,而不是编译期间的声明,而且她们可以嵌套在if测试中,出现在函数def之中等,直到执行程序时,python执行到这些语句,
才会进行解析。就像def一样,import和from都是隐式的赋值语句,import将整个模块对象赋值给一个变量名,from将一个或多个变量名赋值给另一个模块中的同名对象
‘‘‘

#3.
#A:以from复制的变量会变成对共享对象的引用,这个行为就和python的函数传参一样
#B:为了实际修改另一个模块内的全局变量,必须使用import
‘‘‘
Test.py内容:
L0 = []
valueTest = 10

def FunTest():
    return L0, valueTest
‘‘‘

from Test import L0, valueTest, FunTest
value0 = FunTest()          #value0 = ([], 10)
L0.append(10)               #由于模块Test内的L0是可变对象,所以这句代码会影响Test模块内的L0
valueTest = ‘a‘             #注意点:这句代码并没有改变Test模块内的valueTest变量
value1 = FunTest()          #value1 = ([10], 10)
L0 = ‘b‘
value2 = FunTest()          #value2 = ([10], 10)

import Test
Test.L0 = ‘a‘
Test.valueTest = ‘b‘
value3 = FunTest()          #value3 = (‘a‘, ‘b‘)

#4.
#A:在模块文件顶层每一个赋值了的变量名都会变成该模块的属性
#B:模块的命名空间能通过属性__dict__或者dir(M)获取
value0 = Test.__dict__
‘‘‘
value0 =
{‘FunTest‘: <function FunTest at...002DE09D8>, ‘L0‘: ‘a‘, ‘__builtins__‘: {‘ArithmeticError‘: <class ‘ArithmeticError‘>,
‘AssertionError‘: <class ‘AssertionError‘>, ‘AttributeError‘: <class ‘AttributeError‘>, ‘BaseException‘: <class ‘BaseException‘>, ‘Block...
‘‘‘

value1 = dir(Test)
‘‘‘
value1 = [‘FunTest‘, ‘L0‘, ‘__builtins__‘, ‘__cached__‘, ‘__doc__‘, ‘__file__‘, ‘__loader__‘, ‘__name__‘, ‘__package__‘, ‘__spec__‘, ‘valueTest‘]
‘‘‘

#5.
#A:模块可以互相导入
‘‘‘
Test1.py内容:
import Test2
valueTest1 = ‘Test1‘

Test2.py内容:
import Test1
valueTest2 = ‘Test2‘
‘‘‘

import Test1
import Test2
value0 = Test1.valueTest1           #value0 = ‘Test1‘
value1 = Test2.valueTest2           #value1 = ‘Test2‘
value2 = Test1.Test2.valueTest2     #value2 = ‘Test2‘
value3 = Test2.Test1.valueTest1     #value3 = ‘Test1‘

#6.
#A:reload函数会强制已加载的模块的代码重新载入并重新执行。此文件中的新的代码的赋值语句会在适当的地方修改现有的模块对象
#B:reload存在于模块imp中,是一个内置函数,程序中任何引用该模块的地方,自动会受到reload的影响。
#C:reload之后,对于原先使用from引用的对象,其引用的对象仍然是旧对象
‘‘‘
Test3.py内容:
print("Begin Import Test3", end = ‘---‘)

L0 = []
valueTest = 10

print("End Import Test3")
‘‘‘

from Test3 import L0, valueTest, FunTest    #输出:Begin Import Test3---End Import Test3
import Test3                                #并没有输出
value0 = L0                                 #value0 = []
value1 = Test3.valueTest                    #value1 = 10

‘‘‘
打个断点,将Test3.py内容修改为:
print("Begin Import Test3", end = ‘---‘)

L0 = ‘a‘
valueTest = ‘b‘

print("End Import Test3")
‘‘‘
from imp import reload
reload(Test3)                               #输出:Begin Import Test3---End Import Test3
tuple0 = value0, value1                     #tuple0 = ([], 10)
value0 = L0                                 #value0 = []
value1 = Test3.valueTest                    #value1 = ‘b‘

from Test3 import L0, valueTest, FunTest    #并没有输出
value0 = L0                                 #value0 = ‘a‘

  

时间: 2024-10-09 19:19:01

第二十二章 模块代码编写基础的相关文章

第二十二章 TCP/IP层的实现

                      第二十二章    TCP/IP层的实现        我比较喜欢先难后易,如果把GPU显示管理.和网络管理拿下后:我会从头整理.改写一遍APO操作系统.这样,就会形成APO操作系统的锥形.也获得了全局观.内核CPU线路.和用户CPU线路,你可以将它们看成是独立的2个32位CPU核:内核CPU主要任务是实时处理.硬件中断,256个实时线程包含了一些中断程序的后半部.用户CPU主要是动态优先级进程.线程调度,各种应用程序的运行:2个核之间是通过消息交互.句

Gradle 1.12用户指南翻译——第二十二章. 标准的 Gradle 插件

其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个程序浏览文档,带缓存功能的,兼容

“全栈2019”Java第二十二章:控制流程语句中的决策语句if-else

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第二十二章:控制流程语句中的决策语句if-else 下一章 "全栈2019"Java第二十三章:流程控制语句中决策语句switch上篇 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf

20190925 On Java8 第二十二章 枚举

第二十二章 枚举 基本 enum 特性 创建 enum 时,编译器会为你生成一个相关的类,这个类继承自 Java.lang.Enum. valueOf() 是在 Enum 中定义的 static 方法,它根据给定的名字返回相应的 enum 实例,如果不存在给定名字的实例,将会抛出异常. 将静态类型导入用于 enum 使用 static import 能够将 enum 实例的标识符带入当前的命名空间,所以无需再用 enum 类型来修饰 enum 实例. 方法添加 除了不能继承自一个 enum 之外

第二十二章 Linux文件比较,文本文件的交集、差集与求差:comm命令

第二十二章 Linux文件比较,文本文件的交集.差集与求差:comm命令 名词解释 comm 命令 可以用于两个文件之间的比较,它有一些选项可以用来调整输出,以便执行交集.求差.差集操作. 交集:打印两个文件所共有的行 求差:打印出指定文件所包含的其不相同的行. 差集:打印出包含在一个文件中,但不包含在其他指定文件中的行. 语法 comm(选项)(参数) 选项 -1 :不显示在第一个文件出现的内容: -2 :不显示在第二个文件中出现的内容: -3 :不显示同时在两个文件中都出现的内容. ? 参数

《Linux命令行与shell脚本编程大全》第二十二章 gawk进阶

gawk是一门功能丰富的编程语言,你可以通过它所提供的各种特性来编写好几程序处理数据. 22.1 使用变量 gawk编程语言支持两种不同类型的变量: 内建变量和自定义变量 22.1.1 内建变量 gawk程序使用内建变量来引用程序数据里的一些特殊功能 1.字段和记录分隔符变量 数据字段变量:允许你使用美元符和字段在该记录中的位置值来引用记录对应的字段. 要引用第一个字段就用变量$1,第二个就用$2,-.以此类推. 数据字段是由分隔符来划定的.默认字段分隔符是一个空白字符,也就是空格或者制表符.

SQL必知必会 笔记 第二十二章 了解高级SQL特性

22.1约束 为正确地进行关系数据库设计,需要一种方法来保证只在表中插入合法的数据.例如,如果Orders表存储订单信息,OrderItems表存储订单详细内容,应该保证Orderitems中引用的任何订单ID存在于Orders中.类似地,在Orders表中引用的任意用户必须存在于Customers表中. 虽然可以在插入新行时进行检查,但最好不要这样做,原因如下: (1)如果在客户机层面上实施数据库完整性规则,则每个客户机都被迫要实施这些规则,但很可能会有一些客户机不实施这些规则. (2)在执行

第二十二章 开发者测试

单元测试是将一个程序员或者一个开发团队所编写的,一个完整的类.子程序或者小程序,从完整的系统中隔离出来进行测试: 组件测试是将一个类.包.小程序或者其他编程元素,熊一个更加完整的系统中隔离出来进行测试,这些测试代码涉及到多个程序员或者多个团队: 集成测试是对两个或更多的类.包.组件或者子系统进行的联合测试,这些组件由多个程序员或者开发团队所创建.这种测试通常在有了两个可以进行测试的类的时候就应该尽快开始,并且一直持续到整个系统开发完整. 回归测试是指重复执行以前的测试用例,以便在原先通过了相同测

第二十二章 动态分区管理(LPAR)

一.逻辑分区 Lpar即系统级的逻辑分区,它把一台计算机上的硬件资源划分成多个不同的逻辑服务器,每个逻辑服务器上单独运行一个私有的操作系统,这样就可以实现在一台服务器上多个操作系统的运行. 根据在逻辑分区中调配资源是否需要重启这个分区中的操作系统,可以把逻辑分区分成两种:静态Lpar和动态Lpar.静态Lpar是指系统资源(CPU.内存和I/O等)在不同的分区之间移动的时候需要重新启动所有影响到的Lpar,而动态Lpar则可以使用户在不同的分区之间灵活移动资源时不会影响到分区的正常运行,既不需要