从类的实例调用python类方法并不像我所说的那样有效

2024-05-03 10:39:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python新手,我想我正在尝试做一些简单的事情。然而,我对我得到的结果感到困惑。我声明了一个类,它有两个类方法,add和remove,在我的简单示例中,这两个方法从列表类变量中添加或删除客户机。这是我的密码:

服务.py

from Client import Client

class Service:
    clients = []

    @classmethod
    def add(cls, client):
        cls.clients.append(client)

    @classmethod
    def remove(cls, client):
        if client in cls.clients:
            cls.clients.remove(client)


if __name == '__main__'
    a = Client()
    b = Client()
    c = Client()

    Service.add(a)
    Service.add(b)
    Service.add(c)
    print(Service.clients)
    c.kill()
    print(Service.clients)
    Service.remove(c)
    print(Service.clients)

客户端.py

class Client:
    def kill(self):
        from Service import Service
        Service.remove(self)

我希望调用c.kill()会将实例从客户机列表中删除。 但是,当我评估客户机列表时,它显示0项。当我调用Service.remove(c)时,它会显示正确的列表,并按预期删除它。我不知道我在这里错过了什么

如果有必要的话,我目前正在使用PyCharm,我的代码运行在带有python3.6.5的Virtualenv中


Tags: 方法frompyclientadd列表客户机def
1条回答
网友
1楼 · 发布于 2024-05-03 10:39:45

您当前的代码使用循环导入,因为这两个文件相互利用。另外,不要依赖客户机来破坏连接,而是使用contextmanager来促进clients的更新,并且在过程结束时,清空clients

import contextlib
class Client:
  pass

class Service:
  clients = []
  @classmethod
  def add(cls, client):
    cls.clients.append(client)
  @classmethod
  @contextlib.contextmanager
  def thread(cls):
    yield cls
    cls.clients = []

with Service.thread() as t:
  t.add(Client())
  t.add(Client())

相关问题 更多 >