|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
在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 是在类的方法内部修改类变量。如果你想在类的方法内部访问或修改类变量,必须通过 类名.类变量名 的形式,而不能直接使用类变量名。
|
|