我有关于类的问题,我可以用Python代码解释它。代码:
class Game:
variable = 0
def function(self):
print("This is a message inside the class.")
a = Game()
a.variable += 1
a = Game()
a.variable += 1
print(a.variable)
我想在课程中使用它时得到结果2。让我解释一下我为什么要这样做。因为我在" Game"中使用套接字和每个用户。 class online variable的值增加1.为每个用户创建Game类的新实例(在函数connection_made中)。由于实例值的创建是1。
答案 0 :(得分:1)
如果我正确地解释它,你想要计算Game类的实例。这样的事情会起到作用:
class Game:
_count = 0 # class attribute
def __init__(self):
Game._count += 1
self.variable = Game._count # instance attribute
# rest of the code...
a = Game()
b = Game()
print(a.variable) # 1
print(b.variable) # 2
答案 1 :(得分:0)
首先,为了更容易解释,您必须知道执行a.variable += 1
与执行a.variable = a.variable + 1
相同。
现在,正如所说的那样,问题是"。
这里的问题是,当您访问a.variable
时,解释器在实例中找不到该属性,因此它在该类上查找该属性。当它找到它时,它将返回该值。因此,a.variable = a.variable + 1
变为a.variable = 0 + 1
。现在,解释器将转到实例,并查找属性variable
。它没有找到它,所以它创建它并将其设置为一个。
但是什么?那么您从未更改过类variable
中的属性Game
?答案是不。要检查这一点,请尝试使用此代码。
class Game:
variable = 0
def function(self):
print("This is a message inside the class.")
a = Game()
print('Instance attributes before set:', a.__dict__)
print('Class attributes before set', Game.__dict__)
a.variable += 1
print('Instance attributes before set:', a.__dict__)
print('Class attributes after set:', Game.__dict__)
如您所见,您从未更改过类属性。如果要更改类属性,则必须执行
Game.variable += 1
希望有所帮助
答案 2 :(得分:0)
a.variable += 1
是a.variable = a.variable + 1
的缩写。这里发生的是,赋值右侧的a.variable
引用Game.variable
并且值为0,然后创建新实例属性variable
在a
上,值为0 + 1 = 1。永远不会更改Game.variable
,即分配新值。
如果你想增加Game.variable
,你实际上必须将增加的值分配给类Game
,而不是实例。
话虽如此:你真的不想在课堂上有全局反击。这不灵活,容易出错。如果您需要知道用户数,请在某处拥有一个带有用户对象的容器来跟踪用户并查询该容器的长度。