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
相关产品推荐
相关产品推荐

