我有一个类,它通过 python 模块连接到服务器。登录需要一些时间,因此我们的想法是将其实例放入单例模式中,因此我总是传递完全相同的实例。在另一个问题中,我写了详细信息。
但是,我将
__new__
方法添加到了我的类中,如下所示,并且在出现错误提示我提供了 4 个位置参数而不是 1 个之后,我将 user, pass, url
添加到了 __new__
函数中,但这当然不会做任何事都还没有。所以在这一点上我非常困惑,我需要如何重写我的 init/classmethods/__new__
以获得与以前相同的实例化,唯一的区别是我只实例化一次。我还有一种感觉,__init__
每次都会被执行?那么有没有办法将我的__init__
的内容转移到__new__
?主要关心的是,如何将变量分配给即将创建的实例?感谢任何正确方向的指点!
from pybis import Openbis
class OpenBisLoad:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super(OpenBisLoad, cls).__new__(cls)
return cls._instance
def __init__(self, username: str, password: str, url: str):
openbis_object = Openbis(url)
openbis_object.login(username, password, save_token=True)
self.openbis_object = openbis_object
@classmethod
def login_with_credentials(cls, username: str, password: str):
url = URL
return cls(username, password, url)
@classmethod
def login_with_env(cls):
load_dotenv()
return cls(os.getenv("USER"), os.getenv("PASSWORD"), os.getenv("URL"))
一月!
由于每次创建类的新实例时都会执行
__init___
方法,并负责初始化实例属性并在创建新对象时执行任何必要的配置,我认为您的代码 __init___
实际上每次都会执行通过生成不同的单例端口来创建新实例。我相信要实现适当的单例模式,您必须将初始化代码从__init___
移动到__new___
,如下所示:
...
def __new__(cls, username, password, url):
if cls._instance is None:
cls._instance = super(OpenBisLoad, cls).__new__(cls)
openbis_object = Openbis(url)
openbis_object.login(username, password, save_token=True)
cls._instance.openbis_object = openbis_object
return cls._instance
...