您的位置:首页 > 编程语言 > Python开发

Python 实例属性VS类属性1

2016-11-27 19:54 267 查看
# -*- 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、删除已设置对象的类属性值,不会影响类的该属性
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: