Python的類和類實例都是可變對象,可以隨時給屬性賦值,並且在原處修改。
在對類屬性進行修改時需要特別小心,因為所有的類實例都繼承共享類屬性,除非實例本身存在和類屬性同名的屬性。對類屬性進行修改,會影響到所有由這個類生成的實例。
class CA(object): cls_pre = 'aaaaa' def __init__(self): self.obj_pre = 'bbbbb' a = CA() b = CA() print(a.cls_pre, a.obj_pre) print(b.cls_pre, b.obj_pre) CA.cls_pre = 'ccccc' c = CA() d = CA() d.cls_pre = 'ddddd' print(a.cls_pre, a.obj_pre) print(b.cls_pre, b.obj_pre) print(c.cls_pre, c.obj_pre) print(d.cls_pre, d.obj_pre)
運行結果:
aaaaa bbbbb
aaaaa bbbbb
ccccc bbbbb
ccccc bbbbb
ccccc bbbbb
ddddd bbbbb
代碼中,將類屬性CA.cls_pre 重新賦值為 'ccccc'。在修改類屬性之后,不僅是后續創建的類實例c的cls_pre發生變化,在修改類屬性之前的創建的類實例a、b的類屬性cls_pre都發生了變化。
所以,當在class語句外修改類屬性時,會導致所有由這個類創建的實例的類屬性都隨之變化,因為所有的實例都共享類屬性CA.cls_pre。除非實例本身有同名的實例屬性對類屬性進行了覆蓋,比如代碼中的d.cls_pre = 'ddddd'。