gpt4 book ai didi

python - 使用 __del__ 方法清理对象

转载 作者:行者123 更新时间:2023-11-28 21:21:58 25 4
gpt4 key购买 nike

我正在开发一个 python 程序来监视和控制游戏服务器。游戏服务器有许多游戏核心,这些核心负责处理客户端。

我有一个名为 Server 的 python 类,它包含 Core 类的实例,这些实例用于管理实际的游戏核心。 Core 类需要通过 TCP-Socket 连接到游戏核心,以便向该特定游戏核心发送命令。为了正确关闭这些套接字,Core 类有一个 __del__ 方法可以关闭套接字。

一个例子:

class Server(object):
Cores = [] # list which will be filled with the Core objects
def __init__(self):
# detect the game-cores, create the core objects and append them to self.Cores

class Core(object):
CoreSocket = None # when the socket gets created, the socket-object will be bound to this variable
def __init__(self, coreID):
# initiate the socket connection between the running game-core and this python object

def __del__(self):
# properly close the socket connection

现在,当我使用 Core 类本身时,析构函数总是被正确调用。但是当我使用 Server 类时,Server.Cores 中的 Core 对象 永远不会被破坏。 我已经阅读gc 在循环引用和带有析构函数的类方面存在问题,但是 Core 对象从不引用 Server 对象(只有 socket-object,在 Core. CoreSocket),因此不会创建循环引用。

我通常更喜欢使用 with 语句来清理资源,但在这种情况下,我需要通过 Server 类中的许多不同方法发送命令,因此使用 with 无济于事……我还尝试在每个命令上创建和关闭套接字,但是当我需要发送许多命令时,这确实会降低性能。使用 weakref 模块创建的弱引用也无济于事,因为在我创建 Server 对象后会立即调用析构函数。

Server 对象被 gc 清理时,为什么 Core 对象没有被正确销毁?我想我只是忘记了一些简单的事情,但我就是找不到它是什么。

或者也许有更好的方法在对象被清理时关闭这些套接字?

最佳答案

您混淆了类成员和实例成员。与其他一些语言不同,在类范围内定义变量会创建类变量,而不是实例变量。当一个 Server 实例死亡时,Server 类仍然存在并且仍然持有对核心的引用。改为在 __init__ 方法中定义 self.cores:

class Server(object):
def __init__(self):
self.cores = []

关于python - 使用 __del__ 方法清理对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20341650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com