You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何修改实例的返回值?附Selenium WebDriver单例实现代码

如何修改Python单例Driver类的实例返回值?

看起来你想要让你的单例Driver类在实例化时,返回的结果更贴合实际使用需求(比如直接返回内部的Selenium WebDriver对象)对吧?下面给你两种实用的实现方案:

方案一:通过__getattr__转发属性/方法(推荐)

这种方式保留Driver类的实例,但让它的行为完全模仿内部的WebDriver对象,同时还能保留你自己扩展的功能:

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        # 检查驱动是否已关闭,若关闭则重新初始化
        try:
            # 通过session_id判断驱动是否有效
            cls._instances[cls]._driver.session_id
        except:
            cls._instances[cls]._driver = cls._instances[cls].load_selenium_driver()
        return cls._instances[cls]

class Driver(metaclass=Singleton):
    """确保同一时间仅打开一个Driver。若驱动已关闭,尝试退出旧实例并重新创建新实例"""
    def __init__(self):
        self._driver = self.load_selenium_driver()

    def load_selenium_driver(self):
        # 这里替换成你的驱动初始化逻辑
        from selenium import webdriver
        return webdriver.Chrome()

    # 重载__getattr__,将所有未定义的属性/方法转发给内部的_driver
    def __getattr__(self, name):
        return getattr(self._driver, name)

使用时,你可以直接像操作原生WebDriver一样操作Driver实例:

driver = Driver()
driver.get("https://www.example.com")
print(driver.title)
driver.quit()

这种方案的好处是,你还能在Driver类里添加自定义方法(比如封装常用的元素定位、日志打印等),完全不影响原生WebDriver的使用。

方案二:让单例直接返回WebDriver对象

如果你希望Driver()直接返回原生的WebDriver实例,而隐藏Driver类的存在,可以修改单例元类的__call__方法:

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            # 创建Driver实例并提取内部的WebDriver对象
            driver_wrapper = super(Singleton, cls).__call__(*args, **kwargs)
            cls._instances[cls] = driver_wrapper._driver
        else:
            # 检查驱动是否有效,无效则重建
            try:
                cls._instances[cls].session_id
            except:
                driver_wrapper = super(Singleton, cls).__call__(*args, **kwargs)
                cls._instances[cls] = driver_wrapper._driver
        return cls._instances[cls]

class Driver(metaclass=Singleton):
    """确保同一时间仅打开一个Driver。若驱动已关闭,尝试退出旧实例并重新创建新实例"""
    def __init__(self):
        self._driver = self.load_selenium_driver()

    def load_selenium_driver(self):
        from selenium import webdriver
        return webdriver.Chrome()

这种方式下,driver = Driver()得到的直接就是Selenium的WebDriver对象,和你直接webdriver.Chrome()初始化的对象完全一致,但自动帮你处理了单例和失效重建的逻辑。


内容的提问来源于stack exchange,提问作者A H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:05:02