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
  • 相关阅读:
    【试水CAS-4.0.3】第07节_CASclient配置单点登录
    30分钟,让你彻底明白Promise原理
    【你离硅谷只差一步】网易中国创业家大赛项目火热征集中
    21分钟学会写编译器
    Android 模拟器下载、编译及调试
    GitLab 自动触发 Jenkins 构建
    微服务监控探索
    感觉要火!妹子实地采访网易猪厂程序员七夕怎么过
    延迟任务调度系统—技术选型与设计(下篇)
    使用QUIC
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/10230819.html
Copyright © 2011-2022 走看看