python - 当我们实例化一个对象时,Python中的类变量是否表现为实例变量?

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

考虑以下示例:

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

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

我正在创建 Ciao 类的实例,修改类变量,然后在最后一行打印它。对我来说,类变量 a 在创建对象 i 之后,其行为完全与此代码片段中的实例变量相同。

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

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

最佳答案

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

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]

关于python - 当我们实例化一个对象时,Python中的类变量是否表现为实例变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64256559/

相关文章:

python - 使用 PyDev 运行单元测试

ios - 使用不受实例变量支持的属性

java - 无状态 session Bean 中的实例变量 - 状态如何维护?

python - CKAN 安装 : paster error

python - 使用 x 和 y 的数据框通过 Matplotlib 生成直方图

python - flask - 带有搜索词的 url

python - 每个子类都包含自己的列表吗?

python - 从Python 3中的类对象调用成员方法

python - 使用 Python 解析大型 journalctl 文件以匹配关键字的有效方法

python - 似乎无法引用实例变量,获取 "global name ... is not defined"