Python 如何在整个项目中共享类的实例?

Python 如何在整个项目中共享类的实例?,python,python-3.x,class,oop,pypy,Python,Python 3.x,Class,Oop,Pypy,我正在开发一个python库,它通过一个类来接口它的功能。库的用户需要在首次将其导入到项目中时对此进行说明。在此之后,库对象将具有一些状态,我希望这些状态可以在用户的整个项目中共享 大概是这样的: class Singleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: # don't want __ini

我正在开发一个python库,它通过一个类来接口它的功能。库的用户需要在首次将其导入到项目中时对此进行说明。在此之后,库对象将具有一些状态,我希望这些状态可以在用户的整个项目中共享

大概是这样的:

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            # don't want __init__ to be called every time
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]


class Lib(metaclass=Singleton):
    def __init__(self, msg):
        self.msg = msg

    def print_msg():
        print(self.msg)
图书馆

class Lib():

  def __init__(self, msg):
    self.msg = msg

  def print_msg():
    print(self.msg)
子模块1

from lib import Lib

def test():
  # something like this
  Lib.print_msg()
from lib import Lib

    def test():
        Lib().print_msg()
子模块2

from lib import Lib

def test():
  # something like this
  Lib.print_msg()
用户主机

from lib import Lib:
import submod1, submod2

lib = Lib('message')

submod1.test()
submod2.test()
输出

message
message

看起来单例类非常适合您的用例。在python中实现单例类有多种方法。有关更详细的解释,请参阅答案

尽管对于您的用例,您可以这样做:

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            # don't want __init__ to be called every time
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]


class Lib(metaclass=Singleton):
    def __init__(self, msg):
        self.msg = msg

    def print_msg():
        print(self.msg)
子模块1

from lib import Lib

def test():
  # something like this
  Lib.print_msg()
from lib import Lib

    def test():
        Lib().print_msg()
主文件

from lib import Lib:
import submod1, submod2

    lib = Lib('message')

    submod1.test()
    submod2.test()
Lib.py:

类库: 味精= __初始值=无 @类方法 def打印\u msgcls: printcls.msg 也许是这样的

首次使用:

Lib.msg=abc Lib.print_msg 第二次使用:

Lib.print_msg
将库对象创建为单例。隐藏类本身,公开singleton对象元类中的注释是什么意思?谢谢,请参阅我链接到它的asnwer详细解释。如果希望每次调用init时都添加一个带有cls的else语句。\u instances[cls]。\uuuuu init\uuux*args,**kwargsThanks以获取答案。在项目的其他子模块中导入库时,msg的值会被保留吗?它们会在Python解释器运行的整个过程中被保留。导入是缓存的,因此新的导入不会在一个程序中重新计算代码,即使导入发生在不同的模块中。