Python进阶(三)--global和类属性

global关键字

  一句话归纳为:告诉python解释器,global声明的变量为全局做用域内定义的变量。解释器就会到全局做用域内寻找global定义的变量。python

python的类属性

  类属性至关于其余OO语言的类中的静态变量,定义在类中的属性为类的全部实例所共享。spa

  类属性有两种访问方式:一、经过“类名.变量”的形式访问。二、经过"类实例对象.变量"访问。code

  

 1 #!coding:utf8
 2 
 3 class A(object):
 4     a = 1
 5     def __init__(self):
 6         pass
 7 
 8 if __name__ == '__main__':
 9     test = A()
10     print test.a
11     print A.a

结果均输出1对象

  可是强烈建议使用类名的方式调用,缘由:一、类属性使用类名的方式调用更加规范。二、类的实例对象在进行变量查找的时候,会先查找实例属性(变量),而后才会去查找类属性。因此若实例有同名的属性,则不会调用类属性,则会达不到预期结果。blog

  下面你们在看看找个程序的输出结果是什么?作用域

结果为:字符串

其余的不须要过多的解释都是很正常,按照前面的查找理论均可以解释清楚。在这里我想和你们讲下我对类属性__var和实例属性self.__var的理解:it

  首先把结论和你们说下,__var类属性和实例属性self.__var都被python解释器转换为_Test__var的名字了,因此后面在以Test.__var和t.__var的方式对其进行赋值的时候,都是向类或者对象实例中添加属性而已,这个能够经过dir的方式查看,如图: class

为何会是这样呢?test

  我是这样理解的,"."是一个运算符,在定义类的外部的操做过程是这样的(纯属臆测,爱信不信:-D):在进行赋值的时候,即进行左值运算的时候,若该属性在类中已有,则覆盖该值,若没有,则会建立该属性,并进行赋值。同时建立的属性名即为点运算符后的变量名(所有做为一个字符串),这样的双下划线只会做为字符串的一部分存在,没有任何特殊意思,而在类中,下划线会被解释为含有特殊意思,即在双下划线前加上"_类名"。总结起来感受很像一个字典操做,其实经过__dict__属性也能够验证个人这个猜测,大部分的键即为点后面定义的变量名,而双下划线却会被转义。

 

 欢迎你们指正,共同进步。

相关文章
相关标签/搜索