Python 如何在整个项目中共享类的实例?
我正在开发一个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
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解释器运行的整个过程中被保留。导入是缓存的,因此新的导入不会在一个程序中重新计算代码,即使导入发生在不同的模块中。