Python 借助装饰器,实现父对象使用子对象的方法!

文章目录

  • 1. 引言
  • 2. 实践
    • 2.1 装饰器说明
    • 2.2 定义一个父类
    • 2.3 定义子类
  • 3. 整体来看
  • 4. 参考


1. 引言

这个需求的背景是这样的,我们在写复杂代码时候,可能会用到 Python 的类继承的方法,即子对象继承父对象的一些属性方法。

在这个过程中,有一些方法的整体逻辑是子对象和父对象都通用的,如果每一个子对象都去重写一次,那么冗余的代码很多、且不优雅。

因此,本文主要解决如果借助装饰器,在父对象定义一个统一的方法,在这个方法中使用子对象的方法!

2. 实践

2.1 装饰器说明

装饰器,Python 中一种高级特性,它可以让你在不修改原有函数代码的情况下,给函数增加一些新的功能。装饰器本质上是一个接受函数对象作为参数的可调用对象(通常是函数或类),并返回一个新的函数对象。

为了让你更加清楚装饰器的使用,我这里举一个例子:

def my_decorator(func):  def wrapper():  print("Something is happening before the function is called.")  func()  print("Something is happening after the function is called.")  return wrapper  @my_decorator  
def say_hello():  print("Hello!")  # 调用函数  
say_hello()

输出:

Something is happening before the function is called.  
Hello!  
Something is happening after the function is called.

my_decorator 是一个装饰器,它接受一个函数 func 作为参数,并返回一个新的函数 wrapper。在 wrapper 函数中,我们首先打印一条消息,然后调用原始函数 func,最后再打印一条消息。这样,我们就给原始的 say_hello 函数增加了一些新的功能。

2.2 定义一个父类

from functools import wraps
from typing import Callableclass Parent:def do_func(self):"""子对象要重写!:return:"""pass@classmethoddef run(cls, do_func: Callable) -> Callable:""":param do_func: 指的子对象需要重写的方法 do_func:return:"""@wraps(func)def wrapper(*args, **kwargs):...result = do_func(*args, **kwargs)...# 返回值根据需要,可以不定义,也可以定义成你需要的返回值return resultreturn wrapper

这里有几点说明:

  1. 在Python中,@classmethod 是一个装饰器,用于定义类方法。类方法是绑定到类而不是对象的方法,并且可以通过类或其任何实例进行调用。类方法的第一个参数通常是 cls(虽然名称可以自定义),它代表的是调用该方法的类本身,而不是实例。
  2. 可选,@wraps 是 Python 中 functools 模块提供的一个装饰器,主要用于保留被装饰函数(或方法)的元信息,如 name、module、doc 等属性。在定义装饰器时使用 @wraps 可以确保装饰后的函数与原始函数具有相同的元数据

2.3 定义子类

class Child(Parent):def do_func(self):"""子对象重写父对象的方法:return:"""...return@Parent.rundef my_run(self):return self.do_func()

说明:

  1. do_func 重写了父对象的方法,方便实际的替换调用
  2. @Parent.run 装饰器表示被父对象所装饰,实际中实现了父对象调用子对象的方法 do_func

3. 整体来看

下面给出整体的例子:

from functools import wraps
from typing import Callableclass Parent:def do_func(self):"""子对象要重写!:return:"""pass@classmethoddef run(cls, do_func: Callable) -> Callable:""":param do_func: 指的子对象需要重写的方法 do_func:return:"""@wraps(func)def wrapper(*args, **kwargs):...result = do_func(*args, **kwargs)...# 返回值根据需要,可以不定义,也可以定义成你需要的返回值return resultreturn wrapperclass Child(Parent):def do_func(self):"""子对象重写父对象的方法:return:"""...return@Parent.rundef my_run(self):return self.do_func()if __name__ == '__main__':child = Child()child.my_run()

child.my_run() 中调用了父对象的方法,子对象的实现非常简洁易懂!

4. 参考

Python基础教程之装饰器详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/610718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

游戏后端如何实现服务器之间的负载均衡?

网络游戏已成为人们休闲娱乐的重要方式之一。而在游戏开发中,如何实现服务器之间的负载均衡是一个非常关键的问题。负载均衡不仅可以提高服务器的处理能力,还能保证游戏的稳定性和流畅性。本文将探讨游戏后端如何实现服务器之间的负载均衡。 一、负载均…

Eigen 中的传播计算

Eigen: Reductions, visitors and broadcasting

太实用了!关于ControlNet,这篇你一定要看

一篇文章教会你,从入门到使用。 这里是行者AI,我们专注于人工智能在游戏领域的研究和应用,凭借自研算法,推出游戏AI、智能内容审核、数据平台等产品服务。 controlNet控制生成 anypaint 看到这篇文章的你,一定也是AI绘…

SpringBoot整合人大金仓数据库KingBase

1 去KingBase官网下载驱动jar包 2 将解压得到的所有jar包放置在libs目录下&#xff08;没有就新建一个目录&#xff09; 3 在pom文件添加相关依赖 <!--添加KingBase所需要的依赖--> <dependency><groupId>com.kingbase</groupId><artifactId>kin…

DNS解析原理和k8s DNS 实践

1. 问题背景 1.1 域名解析异常 近期开发的一个功能&#xff0c;需要在k8s集群容器环境中调用公司内部api&#xff0c;api提供了内网域名&#xff0c;解析内网域名异常导致请求超时&#xff0c;因此梳理了下DNS的知识点。 可以先看到下面&#x1f447;这段配置&#xff0c;修…

向量数据库:Milvus

特性 Milvus由Go(63.4%),Python(17.0%),C(16.6%),Shell(1.3%)等语言开发开发&#xff0c;支持python&#xff0c;go&#xff0c;java接口(C,Rust,c#等语言还在开发中)&#xff0c;支持单机、集群部署&#xff0c;支持CPU、GPU运算。Milvus 中的所有搜索和查询操作都在内存中执行…

《每天十分钟》-红宝书第4版-基本引用类型

引用值&#xff08;或者对象&#xff09;是某个特定引用类型的实例。在 ECMAScript 中&#xff0c;引用类型是把数据和功能组织到一起的结构&#xff0c;经常被人错误地称作“类”。虽然从技术上JavaScript 是一门面向对象语言&#xff0c;但ECMAScript 缺少传统的面向对象编程…

Disruptor相关问题及答案(2024)

1、Disruptor 是什么&#xff0c;它解决了什么问题&#xff1f; Disruptor是一个高性能的内存中数据交换框架&#xff0c;由LMAX(伦敦多资产交易所)开发&#xff0c;目的是用于支持交易系统中极高的并发处理。它可以说是一个用于线程间消息传递的工具&#xff0c;但与传统的队…

第32次CCF计算机软件能力认证-第一题

仓库规划 问题描述 西西艾弗岛上共有 n个仓库&#xff0c;依次编号为 1…n。每个仓库均有一个m维向量的位置编码&#xff0c;用来表示仓库间的物流运转关系。 具体来说&#xff0c;每个仓库 i均可能有一个上级仓库 j&#xff0c;满足&#xff1a;仓库 j 位置编码的每一维均大…

【XR806开发板试用】XR806无线OTA功能实验

前言 非常感谢基于安谋科技STAR-MC1的全志XR806 Wi-FiBLE开源鸿蒙开发板试用活动,并获得开发板试用。 XR806不仅硬件功能多&#xff0c;XR806也提供了功能极其丰富的SDK&#xff0c;几天体验下来非常容易上手。常见的功能几乎都有相应的cmd或demo实现&#xff0c;HAL也做得非…

Apache ActiveMQ RCE漏洞复现

Apache ActiveMQ RCE漏洞复现&#xff08;CNVD-2023-69477&#xff09; 1、漏洞版本 Apache ActiveMQ < 5.18.3 Apache ActiveMQ < 5.17.6 Apache ActiveMQ < 5.16.7 Apache ActiveMQ < 5.15.16 2、POC 通过dnslog验证的poc.xml <?xml version"1.…

面对24考研不尽如人意的预期,如何有效应对与规划未来?

文章目录 1. 自我反思与总结&#x1f90f;2. 保持学习与积累✌3. 多元发展与备选方案&#x1f91e;4. 心理调适与激励&#x1f44f; 当你点开这篇文章的时候&#xff0c;或许你正在经历着2024年研究生入学考试之后的心潮起伏。成绩未定&#xff0c;而内心却已有所预感&#xff…

SpringBoot:详解Bean装配

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《SpringBoot从官方文档学习》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、IoC容…

C++:多态|虚函数、虚表底层原理|多态原理

C&#xff1a;多态|虚函数、虚表底层原理|多态原理 前言一、多态的概念二、多态的定义及实现2.1 多态的构成条件2. 2 虚函数2.3 虚函数的重写2.3.1 虚函数重写的例外1&#xff1a;协变(基类与派生类虚函数返回值类型不同)2.3.2 虚函数重写的例外2&#xff1a;析构函数的重写(基…

【hcie-cloud】【18】华为云Stack灾备服务介绍【容灾解决方案介绍、灾备方案架构介绍、管理组件灾备方案介绍、高阶云服务容灾简介、缩略词】【下】

文章目录 灾备方案概述、备份解决方案介绍容灾解决方案介绍华为云容灾解决方案概览云容灾服务云硬盘高可用服务 (VHA)VHA组网结构VHA逻辑组网架构VHA管理组件介绍VHA服务实现原理云服务器高可用服务&#xff08;CSHA&#xff09;CSHA物理组网架构CSHA逻辑组网架构CSHA服务组件间…

面试宝典进阶之redis缓存面试题

R1、【初级】Redis常用的数据类型有哪些&#xff1f; &#xff08;1&#xff09;String&#xff08;字符串&#xff09; &#xff08;2&#xff09;Hash&#xff08;哈希&#xff09; &#xff08;3&#xff09;List&#xff08;列表&#xff09; &#xff08;4&#xff09;Se…

# 大模型实战作业02

大模型实战作业02 知识库助手搭建 注 有些问题在回答的时候可能出现乱码的情况 可能的原因 模型内部提示词知识库 这部分可以做适当的优化&#xff0c;对于无法回答或回答质量不佳的回答返回特定话术提升用户体验

.gitignore作用和使用以及文件无法变黄或忽略文件无效还是被提交问题

目录 .gitignore作用 .gitignore使用 1.语法规范&#xff08;熟悉正则很容易理解&#xff09; 2.示例 文件无法变黄或忽略文件无效还是被提交问题 解决方案 .gitignore作用 .gitignore 文件在 Git 版本控制系统中扮演着非常重要的角色。在任何 Git 仓库中&#xff0c;.giti…

Spring Boot 和 Spring 有什么区别

Spring Boot 和 Spring 是两个不同的概念&#xff0c;它们服务于不同的目的&#xff0c;但它们之间有着紧密的联系。下面是它们之间的主要区别&#xff1a; 目的和定位&#xff1a; Spring&#xff1a;Spring 是一个开源的 Java 平台&#xff0c;它最初由 Rod Johnson 创建&am…

保姆级AI绘画入门教程 从入门到实操!!!!小白必收藏!!!

手把手教你入门绘图超强的AI绘画程序&#xff0c;用户只需要输入一段图片的文字描述&#xff0c;即可生成精美的绘画。给大家带来了全新保姆级教程资料包&#xff08;文末可获取&#xff09; 很多朋友想尝尝AI绘画的鲜&#xff0c;但是使用市场上的AI程序也好、软件也好&#…