Python之旅——类相关变量

本文详细探讨了Python中类变量与实例变量的区别,特别是针对可变与不可变类型的处理方式,以及不同修改方式对对象的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类相关变量

类变量

类的变量,类所在的模块被加载时,初始化类变量及其所引用的对象。

类变量引用可变类型

1.修改可变类型对象成员

类方式

class Demo(object):
    a = [1, 2, 3]       # list为可变类型

if __name__ == "__main__":
    demo1 = Demo()

    Demo.a[1] = 88     # 类方式修改对象成员

    demo2 = Demo()
    print("demo1.a=", demo1.a)
    print("demo2.a=", demo2.a)
    print("Demo.a=", Demo.a)

代码输出:

demo1.a= [1, 88, 3]
demo2.a= [1, 88, 3]
Demo.a= [1, 88, 3]

类对象方式

class Demo(object):
    a = [1, 2, 3]       # list为可变类型

if __name__ == "__main__":
    demo1 = Demo()
    print(demo1.a)

    print("*"*30)

    demo2 = Demo()
    demo2.a[1] = 88     # 类对象方式修改对象成员
    print("demo1.a=", demo1.a)
    print("demo2.a=", demo2.a)
    print("Demo.a=", Demo.a)

代码输出:

[1, 2, 3]
******************************
demo1.a= [1, 88, 3]
demo2.a= [1, 88, 3]
Demo.a= [1, 88, 3]

无论是通过类方式还是类对象方式,修改类变量a所引用的可变类型(list)对象的成员,都将影响类的所有对象(demo1和demo2)。

原因

类变量a所引用的可变类型(list)对象,在模块加载时就已创建,所有新创建对象(demo和demo2)中类变量a都引用同一个可变类型(list)对象。只要对象类变量a的引用未改变,可变类型(list)对象内容的修改,影响类的所有对象。

2.修改类变量引用

类方式

class Demo(object):
    a = [1, 2, 3]       # list为可变类型

if __name__ == "__main__":
    demo1 = Demo()

    print("demo1.a=", demo1.a)
    print("Demo.a=", Demo.a)

    print("*"*30)

    Demo.a = 88     # 类方式修改类变量引用

    demo2 = Demo()
    print("demo1.a=", demo1.a)
    print("demo2.a=", demo2.a)
    print("Demo.a=", Demo.a)

代码输出:

demo1.a= [1, 2, 3]
Demo.a= [1, 2, 3]
******************************
demo1.a= 88
demo2.a= 88
Demo.a= 88

类的方式修改类变量的引用,影响了所有类对象,包括已创建过的类对象。

类对象方式

class Demo(object):
    a = [1, 2, 3]       # list为可变类型

if __name__ == "__main__":
    demo1 = Demo()

    print("demo1.a=", demo1.a)
    print("Demo.a=", Demo.a)

    print("*"*30)

    demo1.a = 88     # 类对象方式修改类变量引用

    demo2 = Demo()
    print("demo1.a=", demo1.a)
    print("demo2.a=", demo2.a)
    print("Demo.a=", Demo.a)

代码输出:

demo1.a= [1, 2, 3]
Demo.a= [1, 2, 3]
******************************
demo1.a= 88
demo2.a= [1, 2, 3]
Demo.a= [1, 2, 3]

类对象方式修改类变量的引用,仅影响当前对象,对其他对象,及类均无影响。

类变量引用不可变类型

类方式

class Demo(object):
    a = 3             # 数字3是常量,属于不可变类型对象

if __name__ == "__main__":
    demo1 = Demo()

    print("demo1.a=", demo1.a)
    print("Demo.a=", Demo.a)

    print("*"*30)

    Demo.a = 88     # 类方式修改类变量引用

    demo2 = Demo()
    print("demo1.a=", demo1.a)
    print("demo2.a=", demo2.a)
    print("Demo.a=", Demo.a)

代码输出:

demo1.a= 3
Demo.a= 3
******************************
demo1.a= 88
demo2.a= 88
Demo.a= 88

类的方式修改类变量的引用,影响了所有类对象,包括已创建过的类对象。

类对象方式

class Demo(object):
    a = 3             # 数字3是常量,属于不可变类型对象

if __name__ == "__main__":
    demo1 = Demo()

    print("demo1.a=", demo1.a)
    print("Demo.a=", Demo.a)

    print("*"*30)

    demo1.a = 88     # 类对象方式修改类变量引用

    demo2 = Demo()
    print("demo1.a=", demo1.a)
    print("demo2.a=", demo2.a)
    print("Demo.a=", Demo.a)

代码输出:

demo1.a= 3
Demo.a= 3
******************************      
demo1.a= 88
demo2.a= 3
Demo.a= 3

类对象方式修改类变量引用,仅影响当前对象,其他对象和类均无影响。

类对象变量

使用self指代的变量,一般在__init__函数中定义。在类对象被创建时进行初始化。无法使用类的方式访问类对象变量。

类对象变量引用可变类型

class Demo(object):
    def __init__(self):
        self.a = [1, 2, 3]       # list类可变对象             

if __name__ == "__main__":
    demo1 = Demo()
    demo2 = Demo()

    print("demo1.a=", demo1.a)
    print("demo2.a=", demo2.a)

    print("*"*30)

    demo1.a[2] = 88     # 修改类对象变量引用对象的成员

    print("demo1.a=", demo1.a)
    print("demo2.a=", demo2.a)

代码输出:

demo1.a= [1, 2, 3]
demo2.a= [1, 2, 3]
******************************
demo1.a= [1, 2, 88]
demo2.a= [1, 2, 3]

每个类对象变量独自拥有类对象的变量,是在每次类对象被创建时所生成的。因此,各个类对象的修改,互不影响。

类对象变量引用不可变类型

class Demo(object):
    def __init__(self):
        self.a = 3             # 数字3是常量,属于不可变类型对象

if __name__ == "__main__":
    demo1 = Demo()
    demo2 = Demo()

    print("demo1.a=", demo1.a)
    print("demo2.a=", demo2.a)

    print("*"*30)

    demo1.a = 88     # 修改类对象变量引用对象

    print("demo1.a=", demo1.a)
    print("demo2.a=", demo2.a)

代码输出:

demo1.a= 3
demo2.a= 3
******************************
demo1.a= 88
demo2.a= 3

类对象变量的修改,各个对象间互不影响。

总结

修改目标类方式类对象方式
类变量可变对象成员类、所有类对象类、所有类对象
类变量引用类、所有类对象当前对象
类对象变量可变对象成员——当前对象
类对象变量引用——当前对象

建议

  • 优先使用类对象的方式修改类变量或者类对象变量;
  • 当涉及变量引用的是可变对象时,需谨慎处理。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值