謹慎修改Python的類屬性


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'。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM