【Python】Python中装饰器和魔法方法的区别

在Python中,装饰器(Decorators)和魔法方法(Magic Methods)是两种不同的高级特性,分别服务于不同的目的。

装饰器 (Decorators)

装饰器是一种强大的工具,它可以修改或增强函数、方法或类的行为。装饰器本质上是一个接收函数作为输入并返回新函数的可调用对象。在Python中,装饰器通常使用 @decorator_name 的语法糖形式出现在函数定义之前。装饰器使得开发者能够在不改变原有函数源代码的情况下,通过包装(wrapping)原始函数来增加额外的功能,比如日志记录、性能分析、权限校验等。
例如:

def log_decorator(func):def wrapper(*args, **kwargs):print(f"Calling function {func.__name__}")result = func(*args, **kwargs)print(f"Function {func.__name__} returned {result}")return resultreturn wrapper@log_decorator
def add(a, b):return a + b

在这个例子中,log_decorator 是一个装饰器,它会在调用 add 函数前后打印日志信息。

魔法方法 (Magic Methods / Dunder Methods)

魔法方法是在Python类中定义的一些特殊方法,它们以两个下划线开始和结束,例如 __init__, __str__, __add__, __len__ 等。这些方法在特定场景下会被Python解释器自动调用,用来实现面向对象编程中的许多核心特性,如对象初始化、字符串表示、运算符重载、迭代、上下文管理等。
例如:

  • __init__(self, ...):当创建一个类的新实例时自动调用,常用于初始化对象的状态。
  • __str__(self):定义对象转换为字符串时的行为,当使用 print() 或者 str() 函数时触发。
  • __add__(self, other):重载加法操作符,允许类实例之间进行加法运算。
class MyInt:def __init__(self, value):self.value = valuedef __add__(self, other):return MyInt(self.value + other.value)def __str__(self):return f"MyInt({self.value})"a = MyInt(5)
b = MyInt(3)
print(a + b)  # 自动调用 __add__ 方法
print(a)      # 自动调用 __str__ 方法

在这个例子中,MyInt 类定义了 __init__ 初始化方法、__add__ 用于支持加法操作的魔法方法和__str__用于显示字符串表示的魔法方法。

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

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

相关文章

IoT物联网可以带来什么?——青创智通

工业物联网解决方案-工业IOT-青创智通 随着科技的飞速发展,IoT物联网已逐渐渗透到我们生活的方方面面,它以其独特的方式,将各种设备、系统和人连接起来,为我们带来了前所未有的便利和惊喜。那么,IoT物联网究竟可以为我…

linux下docker容器的使用

1、根据已有镜像images创建容器 1.1、查看镜像 如果是接手的别人的项目,需要从以往的images镜像中创建新容器,使用命令查看当前机器上的docker镜像: docker images1.2、创建容器 使用docker run 根据images镜像名创建容器,命令…

江南布衣的新商业主义

全球正经历一次商业伦理迭代,从以效率、创新、竞争、公平交易、优胜劣汰等为关键词的旧商业主义,转向商业主义和社会主义兼顾的新商业主义。 联合国全球契约组织于2004年提出的ESG正是这一商业伦理转向的产物,与传统以利润为企业考核核心指标…

Android 静默安装二(无障碍服务版)

近期开发上线一个常驻app,项目已上线,今天随笔记录一下静默安装相关内容。我分三篇静默安装(root版)、静默安装(无障碍版)、监听系统更新、卸载、安装。 先说说我的项目需求:要求app一直运行&am…

数字科技优化金融供给,内外协同激活新质生产力

来源 | 镭射财经(leishecaijing) 新一轮产业变革悄然发生,决定产业高度和竞争格局的底层生产力,也正在经历一场从量变到质变的跃迁。新质生产力则是这场跃迁后的最新呈现。 站在新质生产力爆发的时代拐点,金融业达成…

【鸿蒙HarmonyOS开发笔记】组件编程技巧之样式复用

样式复用 概述 当多个组件具有相同的样式时,若每个组件都单独设置,将会有大量的重复代码。为避免重复代码,开发者可使用Styles或者Extend装饰器将多条样式设置提炼成一个方法,然后直接在各组件声明的位置进行调用,这…

中国贸易金融跨行交易区块链平台CTFU、区块链福费廷交易平台BCFT、中国人民银行贸易金融区块链平台CTFP、银行函证区块链服务平台BPBC

中国人民银行贸易金融区块链平台CTFP介绍 贸易金融的发展概况及存在的问题 1.1 贸易金融的概况 贸易金融是指商业银行在贸易双方债权债务关系的基础上,为国内或跨国的商品和服务贸易提供的贯穿贸易活动整个价值链、全程全面性的综合金融服务。伴随全球化的进程&a…

Docker安装配置

1. 安装docker-ce sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum -y install docker-ce sudo systemctl enable docker 2. 设置代理 参照:https://docs.docker.com/config/daemon/systemd/#httpht…

基于yolov5的单目测距实现与总结+相机模型+标定

写这篇文章的目的是为了总结我之前看的标定,相机模型以及单目测距的内容,如果有错误,还请不吝赐教。 参考链接: 相机模型、相机标定及基于yolov5的单目测距实现 深度学习目标检测目标追踪单目测距 单目测距代码部署(目…

深度学习入门:pytorch基础学习、各模块解析、调优技巧和问题结局

整理了一下之前写的深度学习基础知识文章,方便浏览! 1. pytorch基础学习系列文章,里面代码和示例 《PyTorch深度学习实践》05 用PyTorch实现线性回归 《PyTorch深度学习实践》06 用PyTorch实现Logistic回归 《PyTorch深度学习实践》07加载数…

【Flask开发实战】防火墙配置文件解析(二)之shell读取内容

一、前言 上一篇文章中,介绍了防火墙配置文件包含的基本元素和格式样式,并模拟了几组有代表性的规则内容,作为基础测试数据。在拿到基础测试数据后,关于我们最终想解析成的数据是什么样式的,其实不难看出,…

Dynamo设置明细表字段格式——保留小数位数

Hello大家好!我是九哥~ 今天简单分享一个API的用法,就是设置明细表的中字段的字段格式。 本次呢,主要介绍下如何通过Dynamo设置长度、面积等几种字段的格式,设置小数位数的显示,如下图: 当然了&#xf…

基于ssm的网络游戏公司官方平台设计与实现论文

摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对网络游戏信息管理混乱,出错率高,信息安全性差…

Spark面试整理-解释RDD的宽依赖和窄依赖以及它们对Spark任务调度的影响

在Apache Spark中,RDD(弹性分布式数据集)的依赖关系分为两种类型:窄依赖(Narrow Dependency)和宽依赖(Wide Dependency)。这些依赖关系定义了RDD之间的关联方式,对Spark的任务调度和性能有重要影响。 窄依赖(Narrow Dependency) 定义:在窄依赖中,每个父RDD的分区最…

java零钱兑换(力扣Leetcode322)

零钱兑换 力扣原题链接 问题描述 给你一个整数数组 coins ,表示不同面额的硬币,以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少 的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 你可…

函数递归的总结回顾

函数递归的本质就是其名字——递与归。先递出去, 再收回来。 而递归的思想就是为了让一个复杂的问题变成一个简单的问题 按照我目前的理解,函数递归有两点很重要。一个是它的限定条件,另一个就是函数体内“自调”(就是自我调用语句…

1-Flume中agent的source

Flume(1.11.0版本) 简介 概述 Flume本身是由Cloudera公司开发的后来贡献给了Apache的一套针对日志数据进行收集(collecting)、汇聚(aggregating)和传输(moving)的机制 Flume本身提供了简单且灵活的结构来完成日志数据的传输 Flume有两大版本&#x…

jQuery 选择器--获取元素

文章目录 1 jQuery 基础选择器2 层级选择器3 隐式迭代(重要)4 jQuery 筛选选择器5 jQuery 筛选方法(重点)案例--下拉菜单 6 jQuery 排他思想*案例--左右Tab栏切换 7 jQuery 链式编程 1 jQuery 基础选择器 2 层级选择器 3 隐式迭代(重要) 示例: 4 jQuery 筛选选择器…

oracle表备份及还原

工作中,经常使用Navicat访问及操作Oracle数据库,备份表非常方便Ctrlc、Ctrlv;最近备份表,发现这种操作有问题;数据表有2条检查,使用Ctrlc、Ctrlv操作,发现新备份的表出现4条检查,再对…

Python实战:命令行工具开发

本文将深入探讨如何使用Python开发一个命令行工具。我们将从项目规划、功能实现、用户交互、错误处理和测试等方面进行详细讲解。我们将展示如何使用Python标准库中的argparse模块来处理命令行参数,以及如何构建一个功能完整、易于使用的命令行工具。 一、引言 命…