代码块的分类
python中分几种代码块类型,它们都有自己的作用域,或者说名称空间:
文件或模块整体是一个代码块,名称空间为全局范围
函数代码块,名称空间为函数自身范围,是本地作用域,在全局范围的内层
函数内部可嵌套函数,嵌套函数有更内一层的名称空间类代码块,名称空间为类自身
类中可定义函数,类中的函数有自己的名称空间,在类的内层 类的实例对象有自己的名称空间,和类的名称空间独立 类可继承父类,可以链接至父类名称空间正是这一层层隔离又连接的名称空间将变量、类、对象、函数等等都组织起来,使得它们可以拥有某些属性,可以进行属性查找。
本文详细解释类和对象涉及的名称空间,属于纯理论类的内容,有助于理解python面向对象的细节。期间会涉及全局和本地变量作用域的查找规则,如有不明白之处,可先看文章:Python作用域详述
一个概括全文的示例
以下是一个能在一定程度上概括全文的示例代码段:
x = 11 # 全局变量xdef f(): # 全局变量f print(x) # 引用全局变量xdef g(): # 全局变量g x = 22 # 定义本地变量x print(x) # 引用本地变量xclass supcls(): # 全局变量supcls x = 33 # 类变量x def m(self): # 类变量m,类内函数变量self x = 44 # 类内函数变量x self.x = 55 # 对象变量xclass cls(supcls): # 全局变量cls x = supcls.x # 引用父类属性x,并定义cls类属性x def n(self): # 类变量n self.x = 66 # 对象变量x
如果能理解上面的每个x属于哪个作用域、哪个名称空间,本文内容基本上就理解了。
类的名称空间
下面有一个类,类中有类属性x、y,有类方法m和n。
class supcls(): x = 3 y = 4 def m(self): x = 33 self.x = 333 self.y = 444 self.z = 555 def n(self): return self.x, self.y, self.z
当python解释到supcls代码块后,知道这是一个类,类有自己的名称空间。所以,当知道了这个类里面有x、y、m、n后,这几个属性都会放进类supcls的名称空间中。
如下图:
在上图中,类的名称空间中有属性x、y、m和n,它们都称为类属性。需要说明的是,在python中,函数变量m、n和普通变量没什么区别,仅仅只是它保存了指向函数体的地址,函数体即上图中用func m和func n所表示的对象。
因为有名称空间,可以直接使用完全限定名称去访问这个名称空间中的内容。例如:
print(supcls.x)print(supcls.y)print(supcls.m)print(supcls.n)
输出结果:
3
4
<function supcls.m at 0x02B83738>
<function supcls.n at 0x02B836F0>
新闻热点
疑难解答