下面的代码是一个更大代码的简化版本。我想执行的主要操作是在inc_progress(self)
函数中使用和更改rank
和progress
。
class User:
rank=-8
progress=0
def inc_progress(self):
global rank, progress
rank+=1
print(rank,progress)
u=User()
u.inc_progress()
但它给了我一个错误:NameError: name 'rank' is not defined. Did you mean: 'range'?
有人知道这个问题的可能解决方案吗,这样我就可以在inc_progress(self)
函数中使用和更改rank
和progress
的值
通过在__init__
之外定义rank
和progress
,您已经将它们定义为类变量,这意味着它们属于该类,并且对该类的所有实例都可用。https://pynative.com/python-class-variables/
这里有一个修改后的代码版本,它可以实现你所期望的(可能还有一些你没有做到的!(
class User:
rank=-8
progress=0
def inc_progress(self):
User.rank+=1
print(User.rank, User.progress)
u=User()
u.inc_progress() # Output: -7, 0
好的,太好了!问题解决了,对吧?嗯,也许吧。看看这个。
u=User()
u.inc_progress() # Output: -7, 0
u2 = User()
print(u2.rank, u2.progress) # Output: -7, 0
等等,什么?新创建的User
实例的秩为-7,而不是-8!这就是类变量。如果您希望rank
和progress
特定于实例,则在初始化期间定义它们,并像往常一样使用self
访问它们
class User:
def __init__(self):
self.rank=-8
self.progress=0
def inc_progress(self):
self.rank+=1
print(self.rank, self.progress)
u=User()
u.inc_progress() # Output: -7, 0
u2 = User()
print(u2.rank, u2.progress) # Output: -8, 0