Python中,在__init__之外定义的属性为类属性。
例:

>>> class Example(object):
...     class_flag = "class flag!"
...     def __init__(self, init_flag):
...         self.init_flag = init_flag
...
>>> a, b = Example("init a!"), Example("init b!")
>>> a.init_flag
init a!
>>> b.init_flag
init b!
>>> a.class_flag
class flag!
>>> b.class_flag
class flag!

>>> # 改变类属性Example.class_flag,对象a和b访问到的class_flag都会改变
>>> Example.class_flag ="class flag has been changed!"
>>> # a 和 b 的 class_flag 都指向类属性class_flag,因此它们会同时改变
>>> a.class_flag
class flag has been changed!
>>> b.class_flag
class flag has been changed!

>>> # 但是如果类属性被对象重写了,那么该属性会变为普通对象属性,即该属性的值不在关联类和其他对象
>>> a.class_flag = 'class flag has been changed by a!'
>>> a.class_flag
class flag has been changed by a!
>>> # 类 Example 和 b 的 class_flag 不随a的改变而改变
>>> b.class_flag
class flag has been changed!

init中定义的属性为对象属性,对象之间互不影响。但是在类中定义的属性class_flag,所有对象都可以访问到,且均指向同一个值,只要类属性改变,所有对象的值都会改变。
但是,如果某个对象自身将类属性重写(即赋值),那么在该对象下,这个类属性会被降级为对象属性,同时该对象也无法再次访问到原有的类属性,虽然他们都是同一个变量名,但是指向的值已经不一样了。重写后的指向对象自身的普通属性,重写前的指向类中的类属性。