鱼C论坛

 找回密码
 立即注册
查看: 1511|回复: 4

[已解决]不理解类方法中的一个问题

[复制链接]
发表于 2023-6-29 21:51:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
>>> 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
最佳答案
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  是在类的方法内部修改类变量。如果你想在类的方法内部访问或修改类变量,必须通过  类名.类变量名  的形式,而不能直接使用类变量名。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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  是在类的方法内部修改类变量。如果你想在类的方法内部访问或修改类变量,必须通过  类名.类变量名  的形式,而不能直接使用类变量名。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-29 21:56:15 | 显示全部楼层
1. 因为 conut 定义在 C 类的里面
2. count+=1:不是在C里面,在C.__init__里面
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我好好理解下   感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-29 22:03:05 | 显示全部楼层
歌者文明清理员 发表于 2023-6-29 21:56
1. 因为 conut 定义在 C 类的里面
2. count+=1:不是在C里面,在C.__init__里面

是不是有点像外部函数,内部函数那味了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 17:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表