# -*- 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、删除已设置对象的类属性值,不会影响类的该属性
Python 实例属性VS类属性1
最新推荐文章于 2021-08-05 19:13:19 发布