Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从类的实例调用python类方法不会';I don’我没想到会这样_Python - Fatal编程技术网

从类的实例调用python类方法不会';I don’我没想到会这样

从类的实例调用python类方法不会';I don’我没想到会这样,python,Python,我是Python新手,我想我正在尝试做一些简单的事情。然而,我对我得到的结果感到困惑。我声明了一个类,它有两个类方法,add和remove,在我的简单示例中,这两个方法从列表类变量中添加或删除一个客户机。这是我的密码: Service.py Client.py 我希望调用c.kill()会将实例从客户机列表中删除。 但是,当我评估客户机列表时,它显示0项。当我调用Service.remove(c)时,它会显示正确的列表,并按预期删除它。我不确定我在这里错过了什么 如果有必要的话,我目前正在使用P

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

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


如果有必要的话,我目前正在使用PyCharm,我的代码运行在带有Python 3.6.5的Virtualenv中。

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

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())

您能提供当前和预期输出的示例吗?@Gigaflop在print语句中,我希望调用c.kill()将其自身从列表中删除,下面的print语句表示列表中只有2个客户端。我知道它使用循环导入,但是我仍然希望clients类变量不会有多个实例。
class Client:
    def kill(self):
        from Service import Service
        Service.remove(self)
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())