查看: 253|回复: 0

Python方法覆盖@override装饰器用法与super调用

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
Python 动态类型语言里,构造函数重载、方法覆盖、封装和抽象类的处理方式与 Java 等静态语言不同。本文围绕 @override 装饰器展开,重点包括:构造函数重载通常不必要,方法覆盖靠子类重定义,@override 用于标记覆盖意图,super() 复用父类逻辑,_/__ 前缀表示访问约定,abc 模块定义抽象类。下面按代码落地顺序整理。

一、构造函数重载:用 *args 替代多套 __init__
Python 参数灵活,原文用 *args 接收任意数量参数,说明没必要为了参数个数写多个构造函数。
  1. class Demo:
  2.     def __init__(self, *args):
  3.         self.args = args
  4.         print(8.96)
复制代码
这里 args 会把传入参数收集成元组并保存到 self.args。原文用 print(8.96) 作为构造时输出;实际项目中可替换为真正的初始化逻辑。适用场景是希望一个构造函数兼容不同调用方式,而不是按参数数量拆分多个版本。

二、方法覆盖与 @override 标记
子类继承父类后,如果对父类方法实现不满意,可以定义同名方法覆盖。原文用 @override 标记子类 result 方法,表示它覆盖父类方法。
  1. class Parent:
  2.     def result(self):
  3.         print('Subtraction operation')
  4. class Child(Parent):
  5.     @override
  6.     def result(self):
  7.         print('Addition operation')
复制代码
这里要特别注意:示例直接写了 @override,但没有给出导入语句。解释器在定义 Child 类时会查找 override 这个名字,如果当前命名空间没有该装饰器,就会触发 NameError。所以照抄后跑不起来时,先检查装饰器是否可用,而不是先怀疑继承关系。方法覆盖本身不依赖 @override;它只是声明意图,帮助阅读和静态检查。

三、super() 调用父类方法
如果既要覆盖父类方法,又要保留父类行为,可以用 super().result()。
  1. class ChildWithSuper(Parent):
  2.     def result(self):
  3.         super().result()
  4.         print('Addition operation')
复制代码
执行顺序由代码顺序决定:先 super().result() 输出父类的 Subtraction operation,再输出子类 Addition operation。若调换两行,输出顺序也会调换。完全覆盖时子类只保留自己的逻辑;扩展覆盖时通过 super() 在父类逻辑前后追加行为。

四、访问修饰符与封装:_ 和 __ 是约定
Python 类成员默认公开,原文通过 _ 或 __ 前缀表达受保护或私有概念。双下划线会触发名称混淆。
  1. class Myemployee:
  2.     def __init__(self, myname, myage):
  3.         self.__myname = myname
  4.         self.__myage = myage
  5. print(myemp._Myemployee__myage)
复制代码
原文示例中 myemp 没有展示创建过程,直接按上面顺序执行会因 myemp 未定义而 NameError;实际使用时要先创建 Myemployee 实例。双下划线属性在类外不能直接写成 myemp.__myage,但可以通过 _类名__属性 的形式访问。它不是严格访问控制,而是命名约定和名称改写,用来提升可读性与可维护性。

五、抽象类:abc.ABC 与 abstractmethod
Python 抽象类通过 abc 模块中的 ABC 类实现。抽象方法用 @abstractmethod 标记,子类必须实现,抽象类不能直接实例化。
  1. from abc import ABC, abstractmethod
  2. class AbstractClassExample(ABC):
  3.     @abstractmethod
  4.     def abstract_method(self):
  5.         pass
  6. class ConcreteClass(AbstractClassExample):
  7.     def abstract_method(self):
  8.         print('Implement abstract method')
复制代码
ConcreteClass 实现了 abstract_method 后才能实例化;如果遗漏抽象方法,实例化时会被拦截。原文强调抽象类适合定义通用接口和行为,对设计模式和代码复用有用。

六、实际排查与使用建议
1. @override 报 NameError:检查装饰器是否已导入或定义。原文没有给出导入语句,这是照抄运行时的常见第一现场。
2. super() 输出顺序异常:检查 super().result() 与子类 print 的先后顺序。
3. 构造函数参数不匹配:优先考虑 *args、默认参数等灵活写法,而不是写多个 __init__。
4. 私有属性访问失败:确认名称混淆后的属性名是 _类名__属性。
5. 抽象类无法实例化:检查子类是否实现了全部 @abstractmethod 方法。

总结:原文的启发是,Python 不靠传统构造函数重载和严格访问控制,而是用动态参数、方法覆盖、super()、命名约定和 abc 抽象基类来组织代码。@override 的核心价值是表达覆盖意图;使用时必须保证装饰器可用,并注意与 super() 的配合。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-9-11 15:17 , Processed in 0.021225 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部