如何正确实例化 __new__ 和类方法?

问题描述 投票:0回答:1

我有一个类,它通过 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"))
python singleton
1个回答
1
投票

一月!

由于每次创建类的新实例时都会执行

__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
...
© www.soinside.com 2019 - 2024. All rights reserved.