Python实例属性与类属性

1.类属性为不变对象时的‘隐藏’效果

class Foo(object):
    version = 1.0

f = Foo()
print Foo.version  # 1.0
print f.version   # 1.0

Foo.version += 0.1
print Foo.version # 1.1
print f.version # 1.1

f.version += 0.1
print Foo.version # not be modified, 1.1
print f.version # 1.2

del f.version
print Foo.version # 1.1
print f.version # recover back, 1.1

类属性version,可以通过类名和实例名访问之,都得到1.0。此时,通过类名修改version,都得到1.1。而如果通过实例名修改属性,发现此时创建了一个新的实例属性,其值为1.2,而类属性依旧为1.1。最后删除实例属性,发现通过实例名调用再次得到类属性值1.1。

2.类属性为不变对象

class Foo(object):
    version = {'a':1}

f = Foo()
print Foo.version['a']  # 1
print f.version['a']   # 1

Foo.version['a'] = 2
print Foo.version['a'] # 2
print f.version['a'] # 2

f.version['a'] = 3
print Foo.version['a'] # be modified, 3
print f.version['a'] # 3

del f.version # raise exception here:AttributeError: 'Foo' object attribute 'version' is read-only

类属性可变的情况下,即使使用实例名修改属性值,此时它还是类属性。所以试图通过实例名删除时,会得到异常。

3.类属性持久性

当一个实例在类属性被修改后才创建,那么更新的值就将生效。类属性的修改会影响到所有的实例。

class Foo(object):
    version = 1.0

f1 = Foo()
print f1.version # 1.0

Foo.version += 0.1
print Foo.version  # 1.1
print f1.version   # 1.1

f2 = Foo()
print f2.version # 1.1

Foo.version += 0.1
print f1.version # 1.2
print f2.version # 1.2

f1.version += 0.1
f2.version += 0.2
print Foo.version # 1.2
print f1.version # 1.3
print f2.version # 1.4

Foo.version += 1
print Foo.version # 2.2
print f1.version # 1.3
print f2.version # 1.4

最后两段代码演示了,当通过实例名修改属性,相当于此时创建了一个新的实例属性。所以其后再对类属性进行修改(使用类名修改属性值),将不会影响到实例属性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值