2

我目前正在开发一个 python 扭曲服务器用作消息处理应用程序。我遇到了一个奇怪的问题。

我指定我的类来处理到服务器的 get_POST,并将接收到的消息传递给进一步处理它的类。

消息处理成字典,该字典是每次有新消息时都会实例化的对象的成员。但是,在(例如)一条消息包含字典的 10 个项目之后,当处理只有 9 个条目的消息时,第 10 个仍然会在字典中。

我已经能够通过在处理消息之前明确清除字典来解决这个问题,例如:

d = {}

但是,我很困惑,因为在进一步处理字典并在每条新消息上重新实例化之后,该对象应该超出范围并收集垃圾。它似乎表现得好像对象不是一个实例并且保留成员就好像它是一个单例,或者成员是静态的。

在扭曲的框架下,正常范围策略的行为是否相同,或者我是否需要做一些额外的事情来确保对象在超出范围时被 GC?

谢谢!

-乔。

4

2 回答 2

2

你如何初始化包含字典的类?我想如果您使用以下内容:

class YourClass(object):
     def __init__(self):
         self.d = {}

它会解决你的问题。除非它是某种对象,它不是在每条消息上都实例化,而是由 Twisted 框架池化和重用。您是否尝试将某种日志输出添加到__init__您的类的方法中,以查看它是否实际上是按消息实例化的?

于 2012-04-26T18:10:00.730 回答
1

我怀疑你的类定义看起来像这样:

class MyCoolMessage(object):
    d={}
    def addMessage(self,incoming_msg):
        d['a']=incoming_msg[0]
        d['b']=incoming_msg[1]
        d['c']=incoming_msg[2]

这与上面@John Gaines Jr. 指出的不同,他的方法是正确的。您应该在init中而不是在类级别上初始化每个实例变量。

问题与

class MyCoolMessage(object):
    d={}

设置是 d 的范围成为类而不是实例,它甚至应该可以在没有通过启动类的情况下访问

print (MyCoolMessage.d)
于 2012-04-26T18:16:53.230 回答