-
Notifications
You must be signed in to change notification settings - Fork 0
/
模块
155 lines (117 loc) · 4.14 KB
/
模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#######################################
#################模块##################
#######################################
whwu@master:~/script/python> cat modele1.py
def printer(x):
print x
>>> import modele1 # 得到模块
>>> modele1.printer('Hello world!') # 限定性取得名字(模块.名字)
Hello world!
>>>
>>> from modele1 import printer # 得到一个输出
>>> printer('Hello world!') # 不需要限定名
Hello world!
whwu@master:~/script/python> cat module2.py
print('starting to load...')
import sys
name=42
def func():pass
class klass:pass
print('done loading.')
首先模块被导入(或者作为程序运行),Python从头到尾执行它的语句。
有的语句的作用只是在模块名字空间空间中生成名字,不过其他的语句
在import运行的时候做一些实际的工作。例如,这个文件中的两个print
语句在导入的时候会运行:
>>> import module2
starting to load...
done loading.
>>> module2.sys
<module 'sys' (built-in)>
>>> module2.name
42
>>> module2.func
<function func at 0x2b39615d0c08>
>>> module2.klass
<class module2.klass at 0x2b39615d7770>
>>> module2.__dict__.keys()
['name', '__builtins__', '__file__', '__package__', 'sys', 'klass', 'func', '__name__', '__doc__']
#在模块名字空间里的一些名字都是Python为我们加的:例如__file__给出载入的模块文件名,__name__把知道的名字给导入者
(不带有.py扩展名和路径)
##导入只发生一次##
模块在第一次import和from的时候载入并运行。
运行一个模块的代码生成它的顶层名字。
以后的import或from操作取一个已经载入的模块。
whwu@master:~/script/python> cat simple.py
print 'hello'
spam=1 # 初始化变量
>>> import simple # 第一次导入:载入并运行代码
hello
>>> simple.spam # 赋值生成一个属性
1
>>> simple.spam=2 # 在模块中改变属性
>>>
>>> import simple # 只是取到已经载入的模块
>>>
>>> simple.spam # 代码不重新运行:属性没有改变
2
在这个例子中,print和=语句在模块导入的第一次运行,第二个导入不
不重新运行模块的代码,只是取得python内部模块表中已经生成的模块
##import或from都是赋值
%cat small.py
x=1
y=[1,2]
>>> from small import x,y # 把两个名字拷贝出来
>>> x=42 # 只改变局部的x
>>> y[0]=21 # 在远处改变可变的共享对象
>>>
>>> import small # 得到模块名字
>>> small.x # small的x不是局部的x
1
>>> small.y # 不过我们共享一个改变了的可变对象
[21, 2]
##reload函数##
whwu@master:~/script/python> cat changer.py
#message="first version"
message="After editing"
def printer():
print message
>>> import changer
>>> changer.printer()
First version
>>> import changer # 不终止python,修改changer.py
>>> changer.printer() # 没有作用:用已经载入的模块
First version
>>> reload(changer) # 强制新的代码载入/运行
<module 'changer' from 'changer.py'>
>>> changer.printer() # 现在运行新的代码
After editing
混合模式:__name__和__main__
这里有一个特别的与模块相关的技巧,既可以允许你导入一个模块,
又可作为一个独立程序运行它。每个模块都有一个内置属性叫__name__,
Python中设定如下:
如果文件作为程序运行,在启动的时候,__name__设定为字符串__main__
如果文件是被导入的,__name__被设定为用户已知的模块名
whwu@master:~/script/python> cat runme.py
def tester():
print "It's Christmas in Heaver..."
if __name__=='__main__': # 只在独立运行时才这样
tester() # 而不是被导入时
>>> import runme # 文件作为模块
>>> runme.tester()
It's Christmas in Heaver...
whwu@master:~/script/python> python runme.py
It's Christmas in Heaver...
模块的常见问题
from拷贝名字但并不连接
whwu@master:~/script/python> cat nested1.py
x=99
def printer():
print x
>>> from nested1 import x,printer # 考出名字
>>> x=88 # 只改变局部的"x"
>>> printer() # 嵌套的x仍旧是是99
99
>>> import nested1 # 作为整体得到一个模块
>>> nested1.x=88 # 修改了嵌套的x
>>> nested1.printer()
88