【问题标题】:Do class variables in python behaves as instance variable when we instantiate an object?当我们实例化一个对象时,python中的类变量是否表现为实例变量?
【发布时间】:2021-01-23 03:34:19
【问题描述】:

考虑以下示例:

class Ciao():
    a = 1 
    def whatIsIt(self):
        print(self.a)

i = Ciao()
i.a = 2
i.whatIsIt() #Returns 2

我正在创建 Ciao 类的实例,修改类变量,然后在最后一行打印它。对我来说,类变量 a 在创建对象 i 之后,在这段代码 sn-p 中完全表现为实例变量。

class Ciao2():
    def __init__(self):
        self.a = None
    def whatIsIt(self):
        print(self.a)
i = Ciao2()
i.a = 2
i.whatIsIt() #Returns 2

实例化对象后,类和实例变量有什么根本区别吗?

【问题讨论】:

    标签: python-3.x instance-variables class-variables


    【解决方案1】:

    是的,有根本的区别。当变量是可变的(例如列表)并且您使用同一类的多个实例时,可以看到它。对类变量所做的更改将延续到所有实例,但对实例变量所做的更改不会:

    class Ciao():
        a = [1]
        
        def __init__(self):
            self.b = [1]
            
            
    i1 = Ciao()
    print(i1.a, i1.b)  # [1] [1]
    i1.a.append(2)
    i1.b.append(2)
    print(i1.a, i1.b)  # [1, 2] [1, 2]
    
    i2 = Ciao()
    print(i2.a, i2.b)  # [1, 2] [1]
    

    【讨论】:

    • 啊,这很有趣且违反直觉。假设您正在重新分配类变量(即 i1.a = 5,这不会传播到其他实例的类变量,即 i1.a = 5 而 i2.a = [1] )。另一方面,正如您对可变元素所展示的那样,更改会传播。你知道为什么会有这种行为差异吗?重新分配类变量时是否发生了一些事情?
    • @Tommaso Bendinelli 我认为这归结为可变对象和不可变对象之间通常的区别。当您重新分配一个不可变变量时,真正发生的是创建了一个新变量,而当您重新分配一个可变变量时,原始值会发生变化。
    • 嗯,可能是的
    猜你喜欢
    • 2012-02-18
    • 2023-03-08
    • 2013-10-10
    • 2015-06-09
    • 2020-04-05
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多