1
- > 世人凭自己的智慧,既不认识神,神就乐意用人所当作愚拙的道理拯救那些信的人,这就是神的智慧了。犹太人是要神迹,希腊人是求智慧;我们却是传钉十字架的基督。(1 CORINTHIANS 2 :21-22)
1
+ > 世人凭自己的智慧,既不认识神,神就乐意用人所当作愚拙的道理拯救那些信的人,这就是神的智慧了。犹太人是要神迹,希腊人是求智慧;我们却是传钉十字架的基督。(1 CORINTHIANS 1 :21-22)
2
2
3
3
#类(3)
4
4
@@ -187,9 +187,9 @@ foo.y就是新建的一个实例属性,它没有影响原来的实例属性foo
187
187
188
188
##命名空间
189
189
190
- 命名空间,英文名字:namespaces。在研究类或者面向对象编程中,它常常被提到。
190
+ 命名空间,英文名字:namespaces。在研究类或者面向对象编程中,它常常被提到。虽然在 [ 《函数(2) ] ( ./202.md ) 中已经对命名空间进行了解释,那时是在函数的知识范畴中对命名空间的理解。现在,我们在类的知识范畴中理解“类命名空间”——定义类时,所有位于class语句中的代码都在某个命名空间中执行,即类命名空间。
191
191
192
- 在研习命名空间以前,请打开在python的交互模式下,输入:import this
192
+ 在研习命名空间以前,请打开在python的交互模式下,输入:` import this ` ,可以看到:
193
193
194
194
>>> import this
195
195
The Zen of Python, by Tim Peters
@@ -218,49 +218,7 @@ foo.y就是新建的一个实例属性,它没有影响原来的实例属性foo
218
218
219
219
这是为了向看官说明Namespaces、命名空间值重要性。
220
220
221
- ###什么是命名空间
222
-
223
- 从“一切皆为对象”开始说起吧。对象,很多时候我们直接使用它并不方便,因此要给它取一个名字。打个比方,有这样一个物种,它是哺乳纲灵长目人科人属智人种,这就是所谓的对象,但是,在平时提及这个对象的时候,总是要说“哺乳纲灵长目人科人属智人种”,是不是太麻烦了?于是聪明的这个物种就为这个世界上的各种对象命名,例如将“哺乳纲灵长目人科人属智人种”这个对象命名为“人”。
224
-
225
- 在编程中也是如此,前面在讲述变量相关知识的时候已经说明了变量和引用对象的关系。
226
-
227
- >>> a = 7
228
- >>> id(7)
229
- 137589400
230
- >>> id(a)
231
- 137589400
232
- >>> id(7) == id(a)
233
- True
234
-
235
- 看这个例子。7就是一个计算机内存中存在的对象,用id()这个内置函数可以查看7在内存(在RAM)中的地址。a 就是为这个对象预备的名字,如前面所讲的,它与内存中的一个编号为137589400的对象关联,或者说引用了这个对象,这个对象就是7.
236
-
237
- 如果做了下面的操作:
238
-
239
- >>> a = a + 1
240
- >>> id(a)
241
- 137589388
242
- >>> a
243
- 8
244
- >>> id(8)
245
- 137589388
246
-
247
- 其实,上面操作中的` a + 1 ` 完成的是a引用的对象` 7+1 ` ,只不过是顺着对象7的命名a导入了对象7罢了,这样就在内存中建立了一个新的对象8,同样通过id()函数查看到内存中的地址,通过地址可以看到,这时候的a又自动引用对象8了.
248
-
249
- >>> id(7) #对象7在内存中的地址没变
250
- 137589400
251
- >>> b = 7 #b引用此对象
252
- >>> id(b)
253
- 137589400
254
-
255
- 上面a转换引用对象的过程,是自动完成的。而当b=7的时候,并不是在内存中从新建立一个对象7,而是b引用了已有的对象。这就是python的所谓动态语言的特点。
256
-
257
- ![ ] ( ./2images/20802.png )
258
-
259
- 当然,可以给任何对象取名字,或者说为任何对象都可以建立一个所引用的变量。比如函数、类都可以,此处不赘述,前面已经多次用到了。
260
-
261
- 现在已经又一次明确了,每个名称(命名)——英文中的NAME有动词和名字两种,所以,由于中文的特点,似乎怎么说都可以,只要明白所指,因为中文是强调语境的语言——都与某个对象有对应关系。那么所谓的** 命名空间,就是这些命名(名称)的集合,它们分别与相应的对象有对应关系。**
262
-
263
- 用一句比较学术化的语言说:
221
+ 把在[ 《函数(2)》] ( https://github.com/qiwsir/StarterLearningPython/blob/master/202.md ) 中已经阐述的命名空间用一句比较学术化的语言概括:
264
222
265
223
** 命名空间是从所定义的命名到对象的映射集合。**
266
224
@@ -278,8 +236,6 @@ foo.y就是新建的一个实例属性,它没有影响原来的实例属性foo
278
236
279
237
那么程序在查询上述三种命名空间的时候,就按照从里到外的顺序,即:Local Namespaces --> Global Namesspaces --> Built-in Namesspaces
280
238
281
- 还要补充说一下,既然命名空间中存在着命名和对象的映射,不知道看官看到这句话能想到什么?启发一下,回忆以往学过的那种类型数据也存在映射关系呢?字典,就是那个dictionary,是“键值”对应的,例如:{"name":"qiwsir","lang":"python"}
282
-
283
239
>>> def foo(num,str):
284
240
... name = "qiwsir"
285
241
... print locals()
@@ -288,11 +244,11 @@ foo.y就是新建的一个实例属性,它没有影响原来的实例属性foo
288
244
{'num': 221, 'name': 'qiwsir', 'str': 'qiwsir.github.io'}
289
245
>>>
290
246
291
- 这是一个访问本地命名空间的方法,用print locals() 完成,从这个结果中不难看出,所谓的命名空间中的数据存储结构和dictionary是一样的。
247
+ 这是一个访问本地命名空间的方法,用 ` print locals()` 完成,从这个结果中不难看出,所谓的命名空间中的数据存储结构和dictionary是一样的。
292
248
293
249
根据习惯,看官估计已经猜测到了,如果访问全局命名空间,可以使用 ` print globals() ` 。
294
250
295
- ### 作用域
251
+ ##作用域
296
252
297
253
作用域是指 Python 程序可以直接访问到的命名空间。“直接访问”在这里意味着访问命名空间中的命名时无需加入附加的修饰符。(这句话是从网上抄来的)
298
254
0 commit comments