当前位置: 首页 > news >正文

子类必须调用 super().__init__(page) 才能使用父类中的 self.page

  1. 验证实验
    让我用一个简单的例子证明:

python
class BasePage:
def init(self, page):
self.page = page # 在父类初始化中设置
print("父类初始化完成")

class LoginPage1(BasePage):
def init(self, page):
# 不调用父类初始化
print("子类1初始化,但不调用super")

def try_use_page(self):try:print(f"page属性: {self.page}")  # 会报错!except AttributeError as e:print(f"错误: {e}")

class LoginPage2(BasePage):
def init(self, page):
super().init(page) # 调用父类初始化
print("子类2初始化,调用了super")

def try_use_page(self):try:print(f"page属性: {self.page}")  # 正常工作except AttributeError as e:print(f"错误: {e}")

测试

page_obj = "模拟的page对象"

login1 = LoginPage1(page_obj)
login1.try_use_page()

输出: 错误: 'LoginPage1' object has no attribute 'page'

login2 = LoginPage2(page_obj)
login2.try_use_page()

输出: page属性: 模拟的page对象

  1. 为什么必须调用 super().init()
    Python 的继承机制
    python
    class Parent:
    def init(self, value):
    self.value = value # 父类设置属性
    print("父类初始化")

class Child(Parent):
def init(self, value):
# 如果没有调用 super().init()
# 父类的 init 永远不会执行!
print("子类初始化")
# 此时 self.value 不存在!

child = Child("test")
print(hasattr(child, 'value')) # 输出: False
正确的做法
python
class Child(Parent):
def init(self, value):
super().init(value) # 必须先调用父类初始化
print("子类初始化")
# 现在 self.value 可用了

child = Child("test")
print(hasattr(child, 'value')) # 输出: True
3. 在 Playwright 页面对象中的具体应用
python
from playwright.sync_api import Page

class BasePage:
def init(self, page: Page):
self.page = page # 关键:在这里设置 self.page
self.base_url = "https://example.com"

def navigate(self, path=""):self.page.goto(f"{self.base_url}{path}")

class LoginPage(BasePage):
def init(self, page: Page):
# 必须调用父类初始化,否则 self.page 不存在!
super().init(page)

    # 现在可以安全地使用 self.pageself.username_input = self.page.get_by_placeholder("请输入11位手机号")self.password_input = self.page.get_by_placeholder("请输入密码")def login(self, username, password):# 使用 self.page 是安全的,因为父类初始化已调用self.username_input.fill(username)self.password_input.fill(password)
  1. 如果不调用 super().init() 会发生什么
    python
    class BadLoginPage(BasePage):
    def init(self, page: Page):
    # 忘记调用 super().init(page)
    self.username_input = self.page.get_by_placeholder("请输入11位手机号") # 报错!
    # AttributeError: 'BadLoginPage' object has no attribute 'page'
  2. 什么时候可以不用调用 super().init()
    只有当父类没有 init 方法或者父类的 init 方法不需要参数时,才可以不调用:

python
class SimpleParent:
# 没有 init 方法
pass

class SimpleChild(SimpleParent):
def init(self):
# 可以不调用 super().init()
self.value = "hello"

child = SimpleChild()
print(child.value) # 正常工作
6. 最佳实践
总是调用父类初始化
python
class GoodPage(BasePage):
def init(self, page: Page):
super().init(page) # 总是先调用父类
# 然后进行子类的初始化
self.setup_selectors()
self.setup_events()

def setup_selectors(self):self.username_input = self.page.get_by_placeholder("请输入11位手机号")

使用参数传递
python
class BasePage:
def init(self, page: Page, config=None):
self.page = page
self.config = config or {}

class LoginPage(BasePage):
def init(self, page: Page):
# 传递所有必要参数给父类
super().init(page, config={"timeout": 5000})
总结
您的问题非常关键!是的,子类必须显式调用 super().init(page) 才能使用父类中定义的 self.page,因为:

继承不会自动调用父类构造函数

self.page 是在父类 init 中设置的

如果不调用父类 init,这些属性就不会存在

这是 Python(和大多数 OOP 语言)的基本规则

http://www.jsqmd.com/news/32481/

相关文章:

  • 2025 年 11 月底盘悬挂减震气囊,空气弹簧减震气囊厂家最新推荐:产能、专利、环保三维数据透视
  • 2025 年板材源头厂家最新推荐排行榜:聚焦绿色生产与环保认证,精选七家优质企业深度解析
  • 2025年智能家居产品品牌推荐排行 top 5
  • 2025年智能家居产品品牌推荐排行:权威榜单与选择指南
  • 智能家居产品品牌怎么选择:2025年最新攻略
  • 2025 年 11 月驾驶室减震气囊,卡车底盘减震气囊,座椅减震气囊厂家最新推荐,产能、专利、环保三维数据透视!
  • Web3 去魅:写给程序员和普通人的技术解读
  • 上海代理记账服务年度排名:代理记账哪家强?
  • 2025年床垫品牌加盟哪家口碑好?床垫品牌加盟推荐
  • 2025年度全自动四辊卷板机制造商推荐:四辊卷板机哪家好
  • 2025 年最新洗车机厂家推荐排行榜:权威测评下智能 / 自助 / 共享等类型优质企业全景指南
  • 异步FIFO
  • 2025 洗车设备厂家最新推荐排行榜:全自动 / 自助设备企业实力测评与权威选购指南
  • 视频编码标准发展史
  • 2025 年安全触边厂家最新推荐榜:聚焦品质服务商,结合权威测评与市场口碑的全面选购指南防爆灵敏安全触边/无人车安全触边公司推荐
  • 096_尚硅谷_多重循环应用案例
  • 2025 年减震气囊厂家最新推荐榜权威发布:39 项专利企业领衔,驾驶室 / 卡车底盘 / 空气弹簧气囊甄选指南
  • 2025 年 11 月列管冷凝器,列管式冷凝器,不锈钢冷凝器厂家最新推荐,聚焦资质、案例、售后的五家企业深度解读!
  • 2025 年安全地毯源头厂家最新推荐排行榜:聚焦 IP65 防护与 30ms 快速响应,权威测评实力企业全解析防滑安全地毯/机械防护安全地毯/橡胶安全地毯公司推荐
  • 2025年矿用本安型低速图像处理摄像仪厂家权威推荐榜单:矿用本安型显示屏/本安型海思3403主板/本安型海思3519D主板源头厂家精选
  • 【转载】(修改版本)浮点数的表现形式
  • 2025 年 11 月高性价比学习机推荐:松鼠 AI S20 深度测评与选购指南
  • 2025 年 11 月搅拌反应釜,树脂反应釜,高速反应釜,远红外反应釜厂家最新推荐,聚焦资质、案例、售后的五家机构深度解读!
  • 什么是未来的好产业
  • 国家育儿补贴怎么领?领多少?AiPy 计算器帮你一键查询(附计算器生成教程)
  • 安川机器人管材焊接智能节气仪
  • Day12背景属性---拆封写法与复合写法
  • 2025年增加等效弯曲韧性指数纤维定制厂家权威推荐榜单:增韧纤维/高分子聚乙烯纤维/高延性混凝土纤维源头厂家精选
  • 【LVGL】内存分配管理(与 sct 文件配合管理)
  • 焊接效率翻倍!焊台工具的性价比黑马!正点原子T300智能焊台160W 大功率 + 四芯兼容!