Python 实例属性VS类属性1

# -*- coding:utf-8 -*-

import os

class test:
     data=1
     def __init__(self):
          self.a1=0

     def test2(self):
          print 'hello'
          
#类中定义了类类型的变量data,下面我们创建对象t,t1,进行逐步分析,对比

if __name__=='__main__':
     t=test()
     t1=test()

     #1、看看有啥现象
     print 'class test.data',test.data
     print 'class id of address', id(test.data)
     print '-'*10
     print 'object t.data', t.data
     print 'Object id of address', id(t.data)
     print '-'*10
     print 'object t1.data', t1.data
     print 'Object id of address', id(t1.data)
     print '\n'

     #结果如下:
     #class test.data 1
     #class id of address 19584776
     #----------
     #object t.data 1
     #Object id of address 19584776
     #----------
     #object t1.data 1
     #Object id of address 19584776
     #从结果分析看,创建对象,都会引用类属性data属性,而不是copy此属性。
     #通过类名和对象t,对象t1的data值和地址都是一样,引用对象1


     #2、通过对象t修改data属性
     t.data=2
     print 'Change t.data=2'
     print 'class test.data',test.data
     print 'class id of address', id(test.data)
     print '-'*10
     print 'object t.data', t.data
     print 'Object id of address', id(t.data)
     print '-'*10
     print 'object t1.data', t1.data
     print 'Object id of address', id(t1.data)
     print '\n'

     #本次运行结果如下:
     #Change t.data=2
     #class test.data 1
     #class id of address 19584776
     #----------
     #object t.data 2
     #Object id of address 19584764
     #----------
     #object t1.data 1
     #Object id of address 19584776
     #从结果分析看,只有对象t的data属性发生了变化,因为设置或者更新类属性时候,会创建实例属性t.data.
     #类属性data属性和类t1 data属性都没变化。

     #3、通过类test修改data属性
     test.data=10
     print 'Change test.data=10'
     print 'class test.data',test.data
     print 'class id of address', id(test.data)
     print '-'*10
     print 'object t.data', t.data
     print 'Object id of address', id(t.data)
     print '-'*10
     print 'object t1.data', t1.data
     print 'Object id of address', id(t1.data)
     print '\n'
     
     #本次运行结果如下:
     #Change test.data=10
     #class test.data 10
     #class id of address 19584668
     #----------
     #object t.data 2
     #Object id of address 19584764
     #----------
     #object t1.data 10
     #Object id of address 19584668
     #从结果分析看,修改类的属性,会影响对象中没有修改data属性的对象,如对象t1
     #对对象t不影响,t已修改过data属性值。

     #4、删除对象的类属性(该属性为常量)
     print t.data
     del t.data
     print t.data
     print test.data
     print t1.data
     print '\n'
     #2,先访问到了对象的data属性,类的data属性被遮住了
     #10
     #10
     #10

     #第二次删除会报错
     print t.data
     #del t.data
     print t.data
     
     
     #5、可通过__class__ 属性,修改所有的值
     print 'Change t.__class__.data=2'
     t.__class__.data= 2
     print 'class test.data',test.data
     print 'Object t.data', t.data
     print 'Object t1.data', t1.data
     #结果如下:
     #Change t.__class__.data=2
     #class test.data 2
     #Object t.data 2
     #Object t1.data 2

     
     
     
     #总结:
     #1、修改对象的类属性值,不会影响类的类属性值。
     #2、通过对象设置类的属性,会创建该对象的此属性
     #2、修改类的属性值,会影响类属性没有变化的对象。
     #3、删除已设置对象的类属性值,不会影响类的该属性


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值