zoukankan      html  css  js  c++  java
  • python的类变量和对象变量[转]

    原文章:https://www.cnblogs.com/gtarcoder/p/5005897.html

    __dict__里存着{"属性名":属性值}.

    python是一种解释性的语言,任何变量可以在使用的时候才声明以及定义,也可以在程序运行的任何位置进行声明和定义新的变量。

    class Man(object):
        #直接定义的类的变量,属于类   
        #其中 gender, avg_height为基本数据类型,immutable
        #lis为列表类型,为mutable的
        gender = 'male'   
        avg_height = 1.75
        lis = ['hello', 'world']
     
        def __init__(self, name):
            self.name = name  #name在类的构造函数中定义,是属于对象的变量
     
        
    a = Man('jason')
    b = Man('tom')
     
    #通过一个对象a访问一个变量x,变量的查找过程是这样的:
    #先在对象自身的__dict__中查找是否有x,如果有则返回,否则进入对象a所属的类A的
    #__dict__中进行查找
     
    #对象a试图修改一个属于类的 immutable的变量,则python会在内存中为对象a
    #新建一个gender变量,此时a就具有了属于自己的gender变量
    a.gender = 'female'
     
    #对象b试图修改一个mutable的变量,则python找到类Man的__dict__中的变量lis,
    #由于lis是可以修改的,因此直接进行修改,而不会给b新生成一个变量。类Man以及类Man
    #的所有对象都公用这一个lis
    b.lis = ['fuck', 'world']
     
    print a.__dict__ #属于a的变量,有 name, gender
    print b.__dict__  #属于b的变量,只有name
    print Man.__dict__ #属于类Man的变量,有 gender,avg_height,lis,但是不包括 name
    #name是属于对象的变量
     
    Man.t = 'test' #此时Man的变量又多了t,但是对象a和b中没有变量t。
    #(这里可以看出,对象的变量和类的变量是分开的)
     
    print a.gender  #female
    print b.gender  #male
     
    print a.lis #['fuck', 'world']
    print b.lis #['fuck', 'world']
     
    a.addr = '182.109.23.1' #给对象a定义一个变量,对象b和类Man中都不会出现(解释性语言好随性。。)

    需要注意,类的变量(属性)和对象的变量(属性)是“独立”的,但在通过一个对象查找一个变量的时候,会现在改对象自身的__dict__中查找,如果找不到,则进入该对象代表的类的__dict__中进行查找。

    新战场:https://blog.csdn.net/Stephen___Qin
  • 相关阅读:
    Linux下sed,awk,grep,cut,find学习笔记
    Python文件处理(1)
    KMP详解
    Java引用详解
    解决安卓中页脚被输入法顶起的问题
    解决swfupload上传控件文件名中文乱码问题 三种方法 flash及最新版本11.8.800.168
    null id in entry (don't flush the Session after an exception occurs)
    HQL中的Like查询需要注意的地方
    spring mvc controller间跳转 重定向 传参
    node to traverse cannot be null!
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/10230819.html
Copyright © 2011-2022 走看看