zoukankan      html  css  js  c++  java
  • Python进阶(三)--global和类属性

    global关键字

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

    python的类属性

      类属性相当于其他OO语言的类中的静态变量,定义在类中的属性为类的所有实例所共享。

      类属性有两种访问方式:1、通过“类名.变量”的形式访问。2、通过"类实例对象.变量"访问。

      

     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

      但是强烈建议使用类名的方式调用,原因:1、类属性使用类名的方式调用更加规范。2、类的实例对象在进行变量查找的时候,会先查找实例属性(变量),然后才会去查找类属性。所以若实例有同名的属性,则不会调用类属性,则会达不到预期结果。

      下面大家在看看找个程序的输出结果是什么?

    结果为:

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

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

    为什么会是这样呢?

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

     欢迎大家指正,共同进步。

  • 相关阅读:
    邮箱启用授权码发送邮件
    try里Response.end()问题
    NPOI导入excel文件为DataTable,使用SqlBulkCopy添加到数据库表
    Python入门(二)
    Python入门(一):PTVS写Python程序,调试模式下input()提示文字乱码问题
    【译】第4节---简单的Code First示例
    【译】第3节--- 配置开发环境
    【译】第2节--- 什么是Code First?
    【译】第1节--- EF Code First 介绍
    多条件查询----补发周一内容(六级让我忽略了JAVA)
  • 原文地址:https://www.cnblogs.com/break-python/p/6200618.html
Copyright © 2011-2022 走看看