无法从Python服务器访问全局变量

时间:2014-10-15 02:08:21

标签: python

我正在使用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的地方。

2 个答案:

答案 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]分配新列表,则只有该实例才会看到更改,所有其他实例(当前和未来)仍将引用类定义中定义的原始列表。