nvli123 发表于 2023-6-29 21:51:36

不理解类方法中的一个问题

>>> 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

isdkz 发表于 2023-6-29 21:53:08

在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是在类的方法内部修改类变量。如果你想在类的方法内部访问或修改类变量,必须通过类名.类变量名的形式,而不能直接使用类变量名。

歌者文明清理员 发表于 2023-6-29 21:56:15

1. 因为 conut 定义在 C 类的里面
2. count+=1:不是在C里面,在C.__init__里面

nvli123 发表于 2023-6-29 22:01:55

isdkz 发表于 2023-6-29 21:53
在Python中,类的定义是独立的一个名字空间,也就是说类内部的变量和函数都只能通过类来访问。在类定义中的 ...

我好好理解下   感谢

nvli123 发表于 2023-6-29 22:03:05

歌者文明清理员 发表于 2023-6-29 21:56
1. 因为 conut 定义在 C 类的里面
2. count+=1:不是在C里面,在C.__init__里面

是不是有点像外部函数,内部函数那味了
页: [1]
查看完整版本: 不理解类方法中的一个问题