尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

子类必须调用 super().__init__(page) 才能使用父类中的 self.page
📅 发布时间:2026/6/21 9:46:18
  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 语言)的基本规则

墨者看遍天下皆是丹青,测试看尽万物皆是bug

相关新闻

  • 2025 年 11 月底盘悬挂减震气囊,空气弹簧减震气囊厂家最新推荐:产能、专利、环保三维数据透视
  • 2025年智能家居产品品牌推荐排行:权威榜单与选择指南
  • 2025 年 11 月驾驶室减震气囊,卡车底盘减震气囊,座椅减震气囊厂家最新推荐,产能、专利、环保三维数据透视!

最新新闻

  • Seraphine:基于LCU API的英雄联盟终极游戏辅助工具
  • Ubuntu 20.04 安装 Composer:PHP 8.2 环境校准与生产级部署指南
  • 哈尔滨市平房区机动车驾驶培训哪家好 - GrowthUME
  • 大连闲置婚金回收攻略 2026,旧三金旧首饰高价回收不克扣损耗 - 奢侈品交易观察员
  • Rocky Linux 8 Python开发环境搭建全指南
  • 2026安徽普高线下考生,考不上普高能上全日制大学吗?合肥理工职教高考班11年升本榜首 - 小张zc

日新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号