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

这篇具有很好参考价值的文章主要介绍了Python 借助装饰器,实现父对象使用子对象的方法!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


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 Callable


class Parent:
	def do_func(self):
        """
        子对象要重写!
        :return:
        """
		pass
	
    @classmethod
    def run(cls, do_func: Callable) -> Callable:
        """
        :param do_func: 指的子对象需要重写的方法 do_func
        :return:
        """

        @wraps(func)
        def wrapper(*args, **kwargs):
        	...
            result = do_func(*args, **kwargs)
			...
			# 返回值根据需要,可以不定义,也可以定义成你需要的返回值
			return result

        return 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.run
   def my_run(self):
       return self.do_func()

说明:

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

3. 整体来看

下面给出整体的例子:

from functools import wraps
from typing import Callable


class Parent:
	def do_func(self):
        """
        子对象要重写!
        :return:
        """
		pass
	
    @classmethod
    def run(cls, do_func: Callable) -> Callable:
        """
        :param do_func: 指的子对象需要重写的方法 do_func
        :return:
        """

        @wraps(func)
        def wrapper(*args, **kwargs):
        	...
            result = do_func(*args, **kwargs)
			...
			# 返回值根据需要,可以不定义,也可以定义成你需要的返回值
			return result

        return wrapper

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


if __name__ == '__main__':
	child = Child()
	child.my_run()

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

4. 参考

Python基础教程之装饰器详解文章来源地址https://www.toymoban.com/news/detail-810290.html

到了这里,关于Python 借助装饰器,实现父对象使用子对象的方法!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python 面向对象的概念及使用方法~(基础小知识)

    编程语言中,一般有两种编程思维,面向过程和面向对象。 面向过程,看重的是解决问题的过程。 这好比我们解决日常生活问题差不多,分析解决问题的步骤,然后一步一步的解决。 而面向对象是一种抽象,抽象是指用分类的眼光去看世界的一种方法。 Python 就是一门面向

    2024年02月06日
    浏览(41)
  • Python自动化办公:提升效率,释放潜力(借助AI实现)

    欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。搜索关注公粽号《机器和智能》即可领取技术大礼包

    2024年02月15日
    浏览(33)
  • Python元编程-装饰器介绍、使用

    目录 一、Python元编程装饰器介绍 二、装饰器使用 1. 实现认证和授权功能 2.实现缓存功能 3.实现日志输出功能 三、附录 1. logging.basicConfig介绍 2. 精确到毫秒,打印时间 方法一:使用datetime 方法二:使用time Python元编程是指在Python中使用语言自身来创建、修改、或操纵其它代

    2024年02月14日
    浏览(30)
  • 跨界协作:借助gRPC实现Python数据分析能力的共享

    gRPC是一个高性能、开源、通用的远程过程调用(RPC)框架,由Google推出。 它基于HTTP/2协议标准设计开发,默认采用Protocol Buffers数据序列化协议,支持多种开发语言。 在gRPC中,客户端可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容

    2024年02月19日
    浏览(27)
  • python工具方法 45 基于ffmpeg以面向对象多线程的方式实现实时推流

    参考基于ffmpeg模拟监控摄像头输出rtsp视频流并opencv播放 实现视频流的推流。 其基本操作就是,安装视频流推流服务器,ffmpeg,准备好要推流的视频。 命令如下所示: ffmpeg -re -stream_loop -1 -i 风景视频素材分享.flv -c copy -f rtsp rtsp://127.0.0.1:554/input 其中 风景视频素材分享.flv 为

    2024年02月20日
    浏览(20)
  • python装饰器原理 | 常用装饰器使用(@cache, @lru_cache)

    🚀 关于python的装饰器原理介绍可看这里,讲的挺简洁易懂:python装饰器原理 ⭐ 弄懂装饰器原理后,来学学常用装饰器。 也就是一种装饰在被执行的函数上,将其执行的结果缓存起来,当下次请求的时候,如果请求该函数的传参未变则直接返回缓存起来的结果而不再执行函

    2023年04月25日
    浏览(25)
  • Python从入门到精通8天(装饰器的基本使用)

    装饰器是一个著名的设计模式,经常被用于有切面(aspect)需求的场景,如插入日志、性能测试、事务处理等。装饰器可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。这种编程方式被称为面

    2023年04月23日
    浏览(35)
  • python 面向对象编程的特点 - 封装 - 继承(经典类、新式类) - 多态 - 静态方法、类方法 - 下划线的使用 - 回合制攻击游戏实验

    目录 面向对象编程的特点: 封装:封装是将数据和操作(方法)封装在一个对象中的能力 继承:继承是指一个类(子类)可以继承另一个类(父类)的属性和方法。 我们为什么需要继承呢? 父类/基类 = ATM 子类/派生类= ChinaATM/ICBCATM ATM系统父类子类讲解代码: 经典类和新式

    2024年02月15日
    浏览(35)
  • Python 函数(lambda 匿名函数、自定义函数、装饰器)基本使用指南

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段 对于单行函数,使用 lambda 表达式可以省去定义函数的过程,让代码更加简洁; 对于不需要多次复用的函数,使用 lambda 表达式可以在用完之后立即释放,提高程序执行的性能。 格式: 一般形式 含 if

    2024年02月08日
    浏览(43)
  • 深入理解 python 虚拟机:字节码教程(1)——原来装饰器是这样实现的

    在本篇文章当中主要给大家介绍在 cpython 当中一些比较常见的字节码,从根本上理解 python 程序的执行。在本文当中主要介绍一些 python 基本操作的字节码,并且将从字节码的角度分析函数装饰器的原理! 这个指令用于将一个常量加载到栈中。常量可以是数字、字符串、元组

    2023年04月09日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包