zoukankan      html  css  js  c++  java
  • 谨慎修改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'。

  • 相关阅读:
    第01组 Alpha冲刺(4/6)
    第01组 Alpha冲刺(3/6)
    第01组 Alpha冲刺(2/6)
    第01组 Alpha冲刺(1/6)
    第01组 团队Git现场编程实战
    第01组 团队项目-需求分析报告
    团队项目-选题报告
    团队作业-选题报告
    第二次结对编程作业
    第09组 Alpha冲刺(5/6)
  • 原文地址:https://www.cnblogs.com/blackmatrix/p/5614327.html
Copyright © 2011-2022 走看看