Python实例属性与类属性

来源:互联网 发布:js判断是否安装app 编辑:程序博客网 时间:2024/04/29 08:56

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

class Foo(object):    version = 1.0f = Foo()print Foo.version  # 1.0print f.version   # 1.0Foo.version += 0.1print Foo.version # 1.1print f.version # 1.1f.version += 0.1print Foo.version # not be modified, 1.1print f.version # 1.2del f.versionprint Foo.version # 1.1print 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']  # 1print f.version['a']   # 1Foo.version['a'] = 2print Foo.version['a'] # 2print f.version['a'] # 2f.version['a'] = 3print Foo.version['a'] # be modified, 3print f.version['a'] # 3del f.version # raise exception here:AttributeError: 'Foo' object attribute 'version' is read-only

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

3.类属性持久性

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

class Foo(object):    version = 1.0f1 = Foo()print f1.version # 1.0Foo.version += 0.1print Foo.version  # 1.1print f1.version   # 1.1f2 = Foo()print f2.version # 1.1Foo.version += 0.1print f1.version # 1.2print f2.version # 1.2f1.version += 0.1f2.version += 0.2print Foo.version # 1.2print f1.version # 1.3print f2.version # 1.4Foo.version += 1print Foo.version # 2.2print f1.version # 1.3print f2.version # 1.4

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

0 0
原创粉丝点击