首页 > 编程语言 >Python高手进阶:重写vs重载,你真的懂了吗?

Python高手进阶:重写vs重载,你真的懂了吗?

时间:2024-10-29 21:18:13浏览次数:7  
标签:进阶 Python self 重载 vs print 重写 def

在面向对象编程中,“重写”与“重载”是两个核心概念,它们分别对应着如何扩展或改变现有功能的不同方式

尽管Python作为一种动态语言,对于这两种概念的支持与C++、Java等强类型静态语言有所不同,但这并不意味着它们在Python中不存在。

01 / Python中的重写(Overwriting)

重写,又称为方法覆盖,在面向对象编程中指的是子类重新实现父类的方法。这意味着子类可以改变父类方法的行为而不改变其名称,以此提供更具体或更适合自身需求的功能实现。这一过程不仅限于方法,也可以应用于属性和其他成员。

条件

  • 参数列表无需严格匹配:不同于Java或C++中的重写规则,Python中的方法重写不要求参数列表完全一致

  • 返回类型差异性:同样,Python不强制要求重写后的返回类型与原方法一致

  • 访问修饰符放宽:虽然Python没有严格的访问修饰符(public, protected, private),但可以通过命名约定(如单下划线_表示受保护,双下划线__表示私有)控制访问权限,重写时需遵循相应的可见性原则

示例代码:

class BaseClass(object):
 def display(self):
 print("Base Class Display")
​​​​​​​
class DerivedClass(BaseClass):    # 重写display方法
    def display(self):
        print("Derived Class Display")
        
if __name__ == "__main__":
    obj_base = BaseClass()
    obj_derived = DerivedClass()
    
    obj_base.display()  # 输出: Base Class Display
    obj_derived.display()  # 输出: Derived Class Display

02 / “重载”(Overloading) 在Python中的模拟

传统意义上,重载是指在同一作用域内,允许存在多个同名但具有不同参数列表的函数或方法。

然而,由于Python的动态性质,它实际上不支持像C++那样的重载机制。这是因为Python的函数调用时会自动判断传入参数的数量和类型,并进行相应处理。

解决方案:可选参数与默认值

Python通过可选参数和默认值实现了类似于重载的效果。这使得我们可以创建一个看起来像是多个重载版本的函数,但实际上只是一个函数,能够根据提供的参数数量和类型表现出不同的行为。

示例代码:​​​​​​​

class Calculator:
    def calculate(self, a=0, b=None):
        if b is None:
            return f"Singular Value: {a}"
        else:
            return a + b


calc = Calculator()


​​​print(calc.calculate(5))             # 输出: Singular Value: 5
print(calc.calculate(5, 10))         # 输出: 15

03 / 应用场景

重写:比如,考虑一个图形绘制软件的框架开发,其中包含基本形状类,如Shape,以及各种具体实现如Circle, Rectangle等。我们来看看如何通过重写提升用户体验:​​​​​​​

class Shape:
    def draw(self):
        raise NotImplementedError("Subclasses must implement this method.")

class Circle(Shape):
    def draw(self):
        print("Drawing a circle...")

class Rectangle(Shape):
    def draw(self):
        print("Drawing a rectangle...")

# 创新点:增加动画渲染能力
class AnimatedCircle(Circle):
    def draw(self):
        super().draw()
        print("Adding animation effects...")
        
if __name__ == "__main__":
    shapes = [Circle(), Rectangle(), AnimatedCircle()]
    
    for shape in shapes:
        shape.draw()

在这个场景中,AnimatedCircle通过重写Circle的draw方法,不仅保留了基础的圆形绘制,还添加了动画效果,从而为最终用户提供了更丰富的视觉体验。这是重写在拓展功能上的直观体现

“重载”(模拟)的巧妙运用在数据处理或服务端编程中,面对多样化的请求参数,我们需要灵活应变。

例如一个日志记录系统,根据不同层级的信息输出不同的格式:

import logging

class Logger:
    def log(self, message, level=logging.INFO):
        if level == logging.DEBUG:
            self._debug(message)
        elif level == logging.ERROR:
            self._error(message)
        else:
            self._info(message)

    def _debug(self, msg):
        print(f"[DEBUG]: {msg}")

    def _error(self, msg):
        print(f"[ERROR]: {msg}")

    def _info(self, msg):
        print(f"[INFO]: {msg}")

logger = Logger()

logger.log("General info")          # [INFO]: General info
logger.log("Debug info", logging.DEBUG)  # [DEBUG]: Debug info
logger.log("Error message", logging.ERROR)  # [ERROR]: Error message

这里,log方法通过检查level参数决定调用哪个内部方法(_debug, _error, _info),模拟出了类似重载的效果,使日志系统的配置更具弹性和用户友好度。

尽管Python不直接支持传统的“重载”,但它提供了足够的灵活性来达到类似的效果,尤其是在处理多参数的情况时。
而重写的概念则更为直接,允许子类定制父类的方法实现,以适应更具体的场景需求。
无论是重写还是通过可选参数模仿的“重载”,都是为了增强代码的灵活性与适用性。在实际工程实践中,合理利用这两种技术,可以使我们的应用程序更加健壮、高效且易于维护,展现出Python作为现代编程语言的独特魅力。

标签:进阶,Python,self,重载,vs,print,重写,def
From: https://blog.csdn.net/jtaiykt/article/details/143350424

相关文章

  • 猴子请来的补丁——Python中的Monkey Patching
    猴子补丁(MonkeyPatching)在Python中是一种允许在运行时修改对象行为的技术。这种技术可以在不直接修改原始源代码的情况下,动态地改变或扩展程序的行为。猴子补丁的原理猴子补丁的核心原理是利用Python的动态特性,即在运行时修改对象(如函数、方法或类)的属性或行为。在Python......
  • Python从0到100(六十八):Python OpenCV-图像边缘检测及图像融合
    前言:零基础学Python:Python从0到100最新最全教程。想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、计算机视觉、机器学习、神经网络以及人工智能相关知......
  • 用Python将 UE5内存分析日志 提取到Excel表
            上篇文章我们已经实现了 “使用Python批量提取文本中,当某一行存在 “×××××”时获取这一行文字,并将所有提取的内容按顺序保存到一个新的文件中”。而后来我发现这个功能已经不能满足我的需求了,所以本次我们将重新对一个更复杂文件的内容进行批量提......
  • 基于Python+Vue开发的鲜牛奶订购管理系统
    项目简介该项目是基于Python+Vue开发的鲜牛奶订购管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的牛奶订购管理系统项目,大学生可以在实践中学习和提......
  • 基于Python+Vue开发的民宿客房预订管理系统
    项目简介该项目是基于Python+Vue开发的民宿客房预订管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的民宿客房预订管理系统项目,大学生可以在实践中学......
  • 【Azure Bot Service】部署Python ChatBot代码到App Service中
    问题描述使用Python编写了ChatBot,在部署到AppService,却无法启动。通过高级工具(Kudu站点:https://<yoursitename>.scm.chinacloudsites.cn/newui)查看日志显示:Failedtofindattribute'app'in'app'.2024-10-25T02:43:29.242073529Z_____......
  • Python中使用共享变量+信号量实现进程间的实时通信
    【Python程序1中】importctypesimportposix_ipcimportmultiprocessingfrommultiprocessingimportshared_memory#如果系统中已经存在名为/semaphore1的信号量对象,Python并不会重新初始化它,而是使用现有的信号量,#导致现有的信号量可能有残留状态,使得acquire()一直阻......
  • [python]多线程快速入门
    前言线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。由于CPython的GIL限制,多线程实际为单线程,大多只用来处理IO密集型任务。Python一般用标准库threading来进行多线程编程。基本使用方式1,创建threading.Thread类的示例importthreadi......
  • python+flask框架的基于微信小程序的校园跑腿系统服务端视频8(开题+程序+论文) 计算机
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着移动互联网技术的快速发展,微信小程序作为一种轻量级的应用形式,已广泛应用于各类服务场景。在校园环境中,学生对于便捷生活服务的需求日......
  • python+flask框架的基于微信小程序的校园互助平台服务端视频8(开题+程序+论文) 计算机
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着移动互联网技术的飞速发展,微信小程序作为一种轻量级的应用形式,已经深入到人们生活的方方面面。在校园环境中,学生之间经常存在各种互助......