python 如何正确地用__new__和类方法示例化?

lmyy7pcs  于 2023-10-14  发布在  Python
关注(0)|答案(1)|浏览(103)

我有一个类,它通过一个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"))
3bygqnnd

3bygqnnd1#

扬!
由于__init___方法在每次创建类的新示例时都会执行,并且负责初始化示例属性并在创建新对象时执行任何必要的配置,因此我认为您的代码__init___实际上是在每次创建新示例时执行的,因为通过生成不同的Singleton端口创建了新示例。我相信要实现一个合适的Singleton模式,你必须将初始化代码从__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
...

相关问题