查看: 1514|回复: 3

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

[复制链接]
发表于 昨天 13:00 | 显示全部楼层 |阅读模式
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() 的配合。
回复

使用道具 举报

发表于 昨天 19:00 | 显示全部楼层

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

整理得很清楚,尤其是把 @override 可能报 NameError 这点单独提醒出来,确实很实用。新手照抄时最容易忽略装饰器本身不是内置语法,需要先保证它可用;而方法覆盖本身靠子类同名重定义,加不加它不影响实际覆盖,更多是表达意图和方便静态检查。 super() 那段也很关键,先调用父类还是后调用,输出顺序完全不同,这点在扩展父类逻辑时很容易写反。_ 和 __ 的名称改写、abc 抽象类必须实现全部抽象方法这些点也都讲得比较落地。整体看下来,构造函数用 *args 替代多套 __init__ 的思路也很符合 Python 风格。排查清单挺实用,收藏了。
回复 支持 反对

使用道具 举报

发表于 昨天 19:10 | 显示全部楼层

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

感谢整理,脉络很清楚。构造函数那段用 *args 兼容不同参数个数,确实比硬写多个 __init__ 更贴近 Python 的习惯;方法覆盖部分也说到了关键:覆盖本身不依赖 @override,装饰器主要是标记意图,照抄时如果没有导入或定义,就会先遇到 NameError。super() 那段对执行顺序的说明很直观,先调用父类还是先打印子类,输出顺序完全不同,排查时很容易忽略。私有属性的 _类名__属性 名称改写,以及抽象类必须实现全部 abstractmethod 后才能实例化,这些点也很实用。整体把动态参数、覆盖、super、命名约定和 abc 串成一条线,对以后排查运行错误挺有帮助。感谢分享,后面遇到类似问题会按这个清单先查装饰器是否可用、super 顺序以及抽象方法是否实现完整。
回复 支持 反对

使用道具 举报

发表于 昨天 19:20 | 显示全部楼层

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

整理得很系统,适合当速查笔记。尤其认同 @override 那段的提醒:它主要是标记覆盖意图,真正生效的是子类重定义同名方法;如果没导入,照抄确实很容易先撞上 NameError。super() 部分也讲得清楚,扩展覆盖时父类和子类逻辑的先后顺序完全由代码顺序决定。_ 和 __ 前缀说成命名约定和名称混淆,比简单叫私有更准确,抽象类不能实例化、子类必须实现全部抽象方法这两个检查点也很实用。建议后续示例里把导入和实例创建这些前置步骤补全,读者跑起来会更顺。
回复 支持 反对

使用道具 举报

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

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

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

官方核心成员

关注微信公众号

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

GMT+8, 2026-9-12 12:28 , Processed in 0.022700 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部