我有一个类,它通过一个python模块连接到一个服务器。登录需要一些时间,所以我们的想法是把它的示例放到一个单例模式中,所以我总是传递完全相同的示例。在另一个question中,我写了一些细节。
然而,我添加了__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"))
1条答案
按热度按时间3bygqnnd1#
扬!
由于
__init___
方法在每次创建类的新示例时都会执行,并且负责初始化示例属性并在创建新对象时执行任何必要的配置,因此我认为您的代码__init___
实际上是在每次创建新示例时执行的,因为通过生成不同的Singleton端口创建了新示例。我相信要实现一个合适的Singleton模式,你必须将初始化代码从__init___
移动到__new___
,如下所示: