gpt4 book ai didi

python - python中实例变量如何与类变量相关

转载 作者:太空宇宙 更新时间:2023-11-03 15:02:37 27 4
gpt4 key购买 nike

class myclass(object):
i=0
def increase(self):
self.i+=1
print('increased value:', self.i)

if __name__=='__main__':
m=myclass()
m.increase()

这是一个类变量,self.i 是实例变量,执行时 i 得到的 o/P 为 1。

但是如果注释类变量i我得到一个错误

self.i+=1
AttributeError: 'myclass' object has no attribute 'i'

这里类变量i和实例变量self.i之间的关系是什么。

最佳答案

发生的情况是您使用成员变量隐藏了类变量。

看看当您实例化另一个 myclass-object 并向代码中添加一些打印输出时会发生什么:

class myclass(object):
i=0
def increase(self):
myclass.i+=1
print('incresed value:',self.i)

if __name__=='__main__':
m=myclass()
n=myclass()
print("m.i=", m.i)
print("n.i=", n.i)
m.increase()
print("m.i=", m.i)
print("n.i=", n.i)

现在的输出是:

m.i= 0
n.i= 0
incresed value: 1
m.i= 1
n.i= 0

您会看到您增加了 m 的 i 成员的值,但没有增加 n 的值。这是因为 self (如 c++ 中的 this)始终引用当前对象实例。如果将代码更新为以下内容,则实际上是在增加类变量:

def increase(self):
myclass.i+=1
print('incresed value:',self.i)

输出更改为以下内容:

m.i= 0
n.i= 0
incresed value: 1
m.i= 1
n.i= 1

就像 Guillaume Jacquenot 在他的回答中已经指出的那样,如果您想使用成员变量,建议在 __init__() 中初始化它们。在您的情况下,解释器在找不到成员变量时只是使用具有相同名称的类变量,并在同一行中初始化一个成员变量(具有相同的名称 i)。如果您注释掉类变量,则您将尝试增加尚不存在的变量,因此会出现解释器错误。

关于python - python中实例变量如何与类变量相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44940733/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com