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

Python嵌套子类方法封装:如何自动传入外层类实例省略手动传参

实现方案

直接在外层类初始化时实例化嵌套类,提前绑定外层实例即可实现你要的调用效果,具体实现如下:

代码修改示例

from selenium import webdriver

class Driver(webdriver.Chrome):
    class Stack:
        # 嵌套类初始化时接收外层类实例
        def __init__(self, outer_instance):
            self.outer = outer_instance
        
        def login(self, login, password):
            # 直接通过self.outer调用外层驱动的所有方法,不需要额外传参
            self.outer.get("https://stackoverflow.com/login")
            # 后续登录业务逻辑
            pass
        
        def get_notifications(self):
            pass
    
    class Fb:
        def __init__(self, outer_instance):
            self.outer = outer_instance
        # 其他业务方法同理
    
    def __init__(self, *args, **kwargs):
        # 调用父类Chrome的初始化逻辑
        super().__init__(*args, **kwargs)
        # 实例化嵌套类,将当前外层实例绑定到嵌套类中
        self.stack = self.Stack(self)
        self.fb = self.Fb(self)

调用方式

# 初始化外层驱动实例
dr = Driver()
# 直接调用嵌套类方法,不需要手动传入外层实例
dr.stack.login('mylogin', 'mypass')

原理解释

  • 你原来的写法中,stack是外层类的类属性,指向嵌套类本身,和外层类的实例没有绑定关系,因此需要手动传入外层实例才能调用驱动相关方法
  • 修改后stack是外层类的实例属性,是嵌套类的实例,初始化阶段就已经把外层驱动实例存入嵌套类的属性中,所有嵌套类的方法都可以直接通过预先存储的属性调用外层驱动能力,不需要额外传参

内容的提问来源于stack exchange,提问作者LazyBum Q

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:45:04