Python学习 Part7:类
1. 作用域和命名空间
命名空间(namespace)就是一个从名称到对象的映射。
命名空间的一些实例:内置名称集(函数,像abs(),和内置异常名称),一个模块中的全局名称,函数调用时的局部名称。
命名空间在不同的时刻创建,并且具有不同的生命周期。包含内置名称的命名空间在Python解释器启动时即被创建,并且不会被删除。模块的全局命名空间在模块定义被读取时即被创建,通常模块的命名空间会一直保存到解释器退出。
[总结]一个模块的引入,函数的调用,类的定义都会引入命名空间,函数中的再定义函数,类中的成员函数定义会在局部namespace中再次引入局部namespace。
作用域就是一个Python程序可以直接访问命名空间的正文区域。
一个Python程序的几个作用域:
- 最里面的局部作用域
- 外层函数的局部作用域
- 模块的全局作用域
- 包含Python内置对象的最外层作用域
(1)赋值
赋值操作不会拷贝,只是把名字和对象做一个绑定。也就是赋值语句是起一个绑定或重绑定的作用(bind or rebind)。函数调用的参数传递是赋值,不是拷贝。
(2)global和nonlocal语句
global语句用来声明一系列变量,这些变量会引用到当前模块的全局命名空间的变量(module-level namespace),如果该变量没有定义,也会在全局空间中添加这个变量。
nonlocal语句用来声明一系列的变量,这个声明会从声明处从里到外的namespace去搜寻这个变量(the nearest enclosing scope),直到模块的全局域(不包括全局域),找到了则引用这个命名空间的这个名字和对象,若作赋值操作,则直接改变外层域中的这个名字的绑定。nonlocal语句声明的变量不会在当前scope的namespace字典中加入一个key-value对,如果在外层域中没有找到,则如下报错。
>>>SyntaxError: no binding for nonlocal 'spam' found
>>> def test(): def do_local(): spam="local spam" def do_nonlocal(): nonlocal spam spam="nonlocal spam" def do_global(): global spam spam="global spam" spam="test spam" do_local() print("After local assignment: ",spam) do_nonlocal() print("After nonlocal assignment: ",spam) do_global() print("After global assignment: ",spam) >>> test() After local assignment: test spam After nonlocal assignment: nonlocal spam After global assignment: nonlocal spam >>> print("In global scope: ",spam) In global scope: global spam >>>
注意:local赋值语句是无法改变scope_test的spam绑定。nonlocal赋值语句改变了scope_test的spam绑定,并且global赋值语句从模块级改变了spam绑定
2. 类定义语法
class ClassName:
当进入类定义时,就会创建一个新的命名空间,并且用作局部作用域。
当类定义完成时,就创建了一个类对象。