1 类属性和实例属性
2 可变的类属性
1 类属性和实例属性
# coding=utf-8
class C:
s = 100
c = C()
cc = C()
print "类属性值{},类属性地址{},实例属性值{},实例属性地址{}".format(C.s, id(C.s), c.s, id(c.s))
c.s = 150
print "类属性值{},类属性地址{},实例属性值{},实例属性地址{}".format(C.s, id(C.s), c.s, id(c.s))
C.s = 200
print "类属性值{},类属性地址{},实例属性值{},实例属性地址{}".format(C.s, id(C.s), c.s, id(c.s))
print "类属性值{},类属性地址{},实例属性值{},实例属性地址{}".format(C.s, id(C.s), cc.s, id(cc.s))
输出:
类属性值100,类属性地址31620912,实例属性值100,实例属性地址31620912类属性值100,类属性地址31620912,实例属性值150,实例属性地址31621704
类属性值500,类属性地址40599784,实例属性值150,实例属性地址31621704
类属性值500,类属性地址40599784,实例属性值500,实例属性地址40599784
推论:
· 类属性通过类修改
· 初始实例属性和类属性指向同一个地址
· 修改类属性,地址改变,已经初始化的实例属性不变. 若仅初始化实例,没有初始化实例属性,则实例属性指向最新的类属性地址,值也与类属性相同
2 可变的类属性
# coding=utf-8
class C:
l = {'k1': 'v1'}
c = C()
print "实例属性值{},实例属性地址{},类属性值{},类属性地址{}".format(C.l, id(C.l), c.l, id(c.l))
c.l['k2'] = 'v2'
print "实例属性值{},实例属性地址{},类属性值{},类属性地址{}".format(C.l, id(C.l), c.l, id(c.l))
c.l['k1'] = 'v5'
print "实例属性值{},实例属性地址{},类属性值{},类属性地址{}".format(C.l, id(C.l), c.l, id(c.l))
输出:
实例属性值{'k1': 'v1'},实例属性地址40527800,类属性值{'k1': 'v1'},类属性地址40527800
实例属性值{'k2': 'v2', 'k1': 'v1'},实例属性地址40527800,类属性值{'k2': 'v2', 'k1': 'v1'},类属性地址40527800
实例属性值{'k2': 'v2', 'k1': 'v5'},实例属性地址40527800,类属性值{'k2': 'v2', 'k1': 'v5'},类属性地址40527800
推论:
·当类属性是字典或者列表时,可进行添加,和修改