我正在使用SimpleWebSocketServer
找到here类的Python中的小型游戏服务器。一切都很好,但问题是每次我想访问变量时,我都必须使用self.variable_name
。让我举个例子。
class SimpleEcho(WebSocket):
times_played_since_reset = 0
def handleMessage(self):
global times_played_since_reset
print times_played_since_reset
每当我尝试使用全局访问times_played_since_reset
时,它都不起作用,服务器退出。设为self.times_played_since_reset
,一切正常。
此变量需要受连接的每个客户端的影响。不幸的是,当我使用self时,只有客户端影响它自己的实例。我需要它是客户端影响类范围变量而不是self的地方。
答案 0 :(得分:0)
要从python服务器访问全局变量,请使用:
(Class Name).variable
SimpleEcho.times_played_since_reset
答案 1 :(得分:0)
如果您希望在类的所有实例之间共享它,可能需要考虑为times_played_since_reset
使用可变类型。
整数不可变,因此不会共享它们。正如上面的注释中所提到的,您可以通过执行类似SimpleEcho.times_played_since_reset += 1
的操作来显式修改类变量,但是只有在未明确设置/修改同名的实例属性时,这才有效。
例如,举个例子类:
class Foo(object):
bar = 1
如果我们创建两个实例:
>>> x = Foo()
>>> y = Foo()
然后:
>>> x.bar
1
>>> y.bar
1
如果我们这样做:
>>> Foo.bar += 1
然后
>>> x.bar
2
>>> y.bar
2
但如果我们这样做:
>>> x.bar = 7
>>> Foo.bar +=1
然后:
>>> x.bar
7
>>> y.bar
3
如果您要使用类似列表的可变类型,例如:
class Foo(object):
bar = [1]
是否修改Foo.bar[0]
或<instance>.bar.[0]
所有当前和未来的实例都会看到更改。这是因为它们都引用了相同的列表,并且您修改了列表的内容,而不是更改变量指向的特定对象。
但是,如果您要通过<instance>.bar = [78]
分配新列表,则只有该实例才会看到更改,所有其他实例(当前和未来)仍将引用类定义中定义的原始列表。