不理解类方法中的一个问题
>>> class C():... count=0
... def __init__(self):
... C.count+=1
... @classmethod
... def get_count(cls):
... print(f'{cls.count}个实例对象')
为啥 count=0 而不是C.count=0
改了报错
Traceback (most recent call last):
File "<pyshell#137>", line 1, in <module>
c1=C()
File "<pyshell#136>", line 4, in __init__
C.count+=1
AttributeError: type object 'C' has no attribute 'count'
为啥C.count+=1 而不能是count+=1
改了会报错
Traceback (most recent call last):
File "<pyshell#146>", line 1, in <module>
c1=C()
File "<pyshell#145>", line 4, in __init__
count+=1
UnboundLocalError: local variable 'count' referenced before assignment
在Python中,类的定义是独立的一个名字空间,也就是说类内部的变量和函数都只能通过类来访问。在类定义中的变量(在这里是 count )是类的属性,而不是全局变量。
在类的定义中, count = 0是定义了一个类变量(也称为类属性),这是所有实例共享的。当创建类的实例时,你可以通过类名.类变量名 (在这里是C.count )来访问和修改类变量。如果你试图通过count += 1来修改类变量,Python会把count当做一个在__init__方法内部的新的局部变量,而不是你想修改的类变量。由于在count += 1执行前count还没有被定义过,所以 Python 抛出了UnboundLocalError 。
同样的, C.count = 0在类定义外部使用是没有问题的,这是对类属性的正常访问。但如果你试图在类定义内部使用C.count = 0 ,Python还不知道C是什么(因为类C还没有完全定义好),所以会抛出NameError 。
总结一下, count = 0是在类定义内部创建类变量,而C.count += 1是在类的方法内部修改类变量。如果你想在类的方法内部访问或修改类变量,必须通过类名.类变量名的形式,而不能直接使用类变量名。 1. 因为 conut 定义在 C 类的里面
2. count+=1:不是在C里面,在C.__init__里面 isdkz 发表于 2023-6-29 21:53
在Python中,类的定义是独立的一个名字空间,也就是说类内部的变量和函数都只能通过类来访问。在类定义中的 ...
我好好理解下 感谢 歌者文明清理员 发表于 2023-6-29 21:56
1. 因为 conut 定义在 C 类的里面
2. count+=1:不是在C里面,在C.__init__里面
是不是有点像外部函数,内部函数那味了
页:
[1]