当前位置: 首页 > article >正文

Python 3.12 MagicMethods - 67 - __abs__

Python 3.12 Magic Method -__abs__(self)__abs__是 Python 中用于定义绝对值运算的核心魔术方法。当内置函数abs()作用于一个对象时Python 会自动调用该对象的__abs__方法。它最常见的用途是实现数值类型的绝对值也可用于自定义类型如复数、向量、距离等返回其模或大小。正确实现__abs__可以让自定义类自然地支持abs()函数与内置类型保持一致。本文将深入解析其定义、底层机制、设计原则并通过多个示例逐行演示如何正确实现。1. 定义与签名def__abs__(self)-object:...参数self当前对象。返回值应返回一个对象代表abs(self)的结果。通常返回值类型与self不同如向量返回标量也可能是同类型如绝对值后的整数仍是整数。如果运算未定义应返回单例NotImplemented。调用时机当调用abs(x)时Python 会尝试调用x.__abs__()。2. 用途与典型场景数值类型整数、浮点数、复数等自然支持绝对值。向量/矩阵返回向量的模长度或矩阵的范数。自定义度量对象如距离、时间间隔等返回其非负值。实现范数或大小任何有“大小”概念的对象都可以通过__abs__返回其度量值。__abs__通常返回一个标量或与原对象类型不同的结果例如abs(complex(3,4))返回浮点数 5.0而abs(-5)返回整数 5。3. 底层实现机制在 Python/C API 层面绝对值操作由PyNumber_Absolute函数处理。每个类型对象PyTypeObject都有一个tp_as_number结构体其中包含nb_absolute槽位这是一个函数指针用于处理绝对值。当执行abs(x)时解释器会获取x的类型对象的tp_as_number结构。如果存在nb_absolute则调用它传入x返回结果对象或Py_NotImplemented。如果nb_absolute不存在或返回Py_NotImplemented则抛出TypeError。对于 Python 层定义的__abs__它会被包装到nb_absolute槽位中。因此实现__abs__后abs(obj)就能正确调用。在 CPython 的源码中PyNumber_Absolute的实现类似于PyObject*PyNumber_Absolute(PyObject*o){PyNumberMethods*m;if(oNULL)returnnull_error();mo-ob_type-tp_as_number;if(mm-nb_absolute)returnm-nb_absolute(o);returntype_error(bad operand type for abs(): %.200s,o);}可见它直接调用类型对象中的nb_absolute函数。如果该槽位不存在则抛出TypeError。4. 设计原则与最佳实践返回合适的类型通常返回一个数值整数或浮点数但也可以返回自定义类型。例如一个向量的__abs__可以返回其长度浮点数。保持数学含义绝对值应是非负的且满足abs(x) 0。对于自定义对象应遵循这一直观含义。不修改原对象__abs__应是无副作用的返回新对象或标量不改变原对象的状态。与__neg__和__pos__的关系通常绝对值与正负号有关但它们是独立的。一致性如果对象有“大小”概念__abs__应返回该大小。5. 示例与逐行解析示例 1自定义整数类简单的绝对值classMyInt:def__init__(self,value):self.valuevaluedef__abs__(self):返回一个新的 MyInt值为原值的绝对值returnMyInt(abs(self.value))def__repr__(self):returnfMyInt({self.value})逐行解析行代码解释1-3__init__初始化整数值。4-6__abs__定义绝对值运算。5return MyInt(abs(self.value))使用内置abs计算绝对值并包装成新MyInt返回。不修改原对象。7-8__repr__便于显示。为什么这样写返回新对象符合不可变语义原对象不受影响。使用内置abs简化实现确保数学正确性。验证aMyInt(-5)babs(a)print(a)# MyInt(-5) 原对象不变print(b)# MyInt(5)运行结果MyInt(-5) MyInt(5)示例 2二维向量类计算模长importmathclassVector:def__init__(self,x,y):self.xx self.yydef__abs__(self):返回向量的欧几里得长度returnmath.hypot(self.x,self.y)# sqrt(x^2 y^2)def__repr__(self):returnfVector({self.x},{self.y})逐行解析行代码解释1-4导入math和初始化存储坐标。5-8__abs__计算向量模长。7return math.hypot(self.x, self.y)hypot直接计算平方和的平方根返回浮点数。9-10__repr__便于显示。验证vVector(3,4)lengthabs(v)print(length)# 5.0为什么这样写向量的大小通常用浮点数表示因此返回float是自然的。不修改原向量。运行结果5.0示例 3复数类模长classMyComplex:def__init__(self,real,imag):self.realreal self.imagimagdef__abs__(self):返回复数的模return(self.real**2self.imag**2)**0.5def__repr__(self):returnfMyComplex({self.real},{self.imag})验证cMyComplex(3,4)print(abs(c))# 5.0运行结果5.0示例 4带缓存的可变对象演示不修改原对象importmathclassLazyNorm:def__init__(self,vector):self.vectorvector self._normNonedef__abs__(self):计算并缓存向量的模ifself._normisNone:self._normmath.hypot(self.vector.x,self.vector.y)returnself._norm解析__abs__在这里可以包含计算逻辑但要注意不要修改self的内部状态这里修改了self._norm作为缓存但这是内部状态不影响对外表现。仍返回浮点数。验证# 示例2 VectorvVector(3,4)lnLazyNorm(v)print(abs(ln))# 第一次计算5.0print(abs(ln))# 第二次直接从缓存返回5.0运行结果5.0 5.0示例 5自定义有理数类返回绝对值classRational:def__init__(self,numerator,denominator1):ifdenominator0:raiseZeroDivisionError self.numeratornumerator self.denominatordenominatordef__abs__(self):返回绝对值有理数returnRational(abs(self.numerator),self.denominator)def__repr__(self):returnfRational({self.numerator},{self.denominator})验证rRational(-3,4)print(abs(r))# Rational(3, 4)运行结果Rational(3, 4)6. 注意事项与陷阱返回类型确保返回的对象类型合理如果返回自定义类型应使其支持进一步操作。避免副作用除非有缓存需求否则不应修改对象内部状态。与__bool__的关系绝对值与布尔值无关但有时bool(obj)可能依赖__len__或__bool__不要混淆。负零对于浮点数abs(-0.0)应返回0.0但 Python 内置abs会正确处理。自定义类应模仿这一行为。复数复数的绝对值是模定义为sqrt(real^2 imag^2)遵循数学定义。7. 总结特性说明角色定义绝对值运算abs(obj)签名__abs__(self) - object返回值通常为数值或与原对象不同类的对象调用时机abs(x)底层C 层的nb_absolute槽位最佳实践返回非负值不修改原对象保持数学含义掌握__abs__可以让自定义类支持abs()函数增加与内置类型的互操作性。无论是简单的数值类还是复杂的数学对象正确实现__abs__都能使代码更符合 Python 习惯。如果在学习过程中遇到问题欢迎在评论区留言讨论!

相关文章:

Python 3.12 MagicMethods - 67 - __abs__

Python 3.12 Magic Method - __abs__(self)__abs__ 是 Python 中用于定义 绝对值运算 的核心魔术方法。当内置函数 abs() 作用于一个对象时,Python 会自动调用该对象的 __abs__ 方法。它最常见的用途是实现数值类型的绝对值,也可用于自定义类型&#x…...

GLM-OCR本地部署体验:纯离线运行,隐私安全有保障,解析速度飞快

GLM-OCR本地部署体验:纯离线运行,隐私安全有保障,解析速度飞快 1. 为什么选择本地部署OCR工具? 在日常工作中,我们经常需要处理各种文档和图片中的文字信息。传统的在线OCR服务虽然方便,但存在明显的隐私…...

Essential Macleod应用:双面镀膜的模拟

传统意义上,Essential Macleod的设计是由一系列完全干涉的薄膜组成,并只在基板的一侧形成膜层。而Stack是由一组膜层和基板组成,基板的两个面是平行的,以便在相同材料中传播角度相同。Stack中,膜层被介质(或…...

FireRedASR Pro Node.js后端服务开发:快速构建语音处理API

FireRedASR Pro Node.js后端服务开发:快速构建语音处理API 你是不是也遇到过这样的场景?手头有一个强大的语音识别模型,比如FireRedASR Pro,它本身可能是一个Python脚本或者服务,功能强大,但直接对外提供调…...

为什么你的Git项目还在用main?master分支的历史渊源与迁移利弊分析

为什么你的Git项目还在用main?master分支的历史渊源与迁移利弊分析 在软件开发的世界里,命名从来不只是简单的标识符选择。Git分支名称从"master"到"main"的转变,背后折射出技术演进与社会意识的微妙互动。当我们打开Git…...

前端代码分割分析:ONLYOFFICE Docs使用Webpack Bundle Analyzer

前端代码分割分析:ONLYOFFICE Docs使用Webpack Bundle Analyzer 【免费下载链接】DocumentServer ONLYOFFICE Docs is a free collaborative online office suite comprising viewers and editors for texts, spreadsheets and presentations, forms and PDF, fully…...

国密算法C实现必须避开的7个隐性陷阱,第4个让国密SSL握手延迟飙升200ms!

第一章:国密算法C实现的性能瓶颈全景图国密算法(如SM2、SM3、SM4)在嵌入式设备、金融终端及政务系统中广泛部署,其C语言实现虽具备跨平台优势,但在实际运行中常遭遇多维度性能制约。深入剖析这些瓶颈,是优化…...

Qwen3-32B-Chat RTX4090D部署案例:跨境电商产品描述生成服务落地

Qwen3-32B-Chat RTX4090D部署案例:跨境电商产品描述生成服务落地 1. 项目背景与价值 跨境电商卖家每天需要为大量商品编写专业的产品描述,传统人工撰写方式面临三大痛点: 效率瓶颈:熟练文案每天最多完成20-30个商品描述成本压力…...

【无人售货柜・RK+YOLO】篇 7:业务闭环!YOLO 实现售货柜开门前后商品比对 自动结算核心逻辑

目录 一、新手先搞懂:视觉开门柜的完整结算业务流程 二、核心概念扫盲:结算逻辑里的关键术语,一次讲透 1. 基线快照(Base Snapshot) 2. 结果快照(Result Snapshot) 3. SKU 计数单元 4. IO…...

Linux进程等待机制:wait与waitpid系统调用详解

1. 进程等待机制:父进程对子进程生命周期的精确管控在 Linux 系统编程中,进程创建(fork())与退出(exit())仅构成生命周期管理的起点与终点。真正体现系统调度严谨性与资源回收可靠性的,是父进程…...

Qwen3-4B Instruct-2507保姆级教程:Linux/Windows双平台部署

Qwen3-4B Instruct-2507保姆级教程:Linux/Windows双平台部署 1. 学习目标与前置准备 大家好,今天我们来聊聊怎么在Linux和Windows系统上,快速部署一个属于你自己的、能流畅对话的AI助手。这个助手基于阿里通义千问的Qwen3-4B-Instruct-2507…...

【无人售货柜・RK+YOLO】篇 8:实时跟踪!YOLO+ByteTrack 解决售货柜开门过程中商品拿取跟踪难题

目录 一、新手先搞懂:什么是多目标跟踪?为什么选 ByteTrack? 【新手概念科普】多目标跟踪(MOT) 为什么偏偏选 ByteTrack? 二、大白话讲透 ByteTrack 的核心工作原理 三、第一步:安卓项目集…...

嵌入式C语言中for(;;)与while(1)的本质差异与工程选择

1. 无限循环的语法表象与工程本质在嵌入式C语言开发实践中,while(1)和for(;;)是最常被用于构建主循环(main loop)或任务调度骨架的两种语法结构。初学者往往将二者等同视作“死循环”的同义表达,认为其功能完全一致,仅…...

Qwen3-0.6B-FP8完整指南:上下文长度512→32K扩展能力实测

Qwen3-0.6B-FP8完整指南:上下文长度512→32K扩展能力实测 1. 引言:当“小模型”遇上“大胃口” 你可能听过很多关于大模型的讨论——动辄几百亿参数,需要昂贵的显卡才能运行。但今天我想和你聊点不一样的:一个只有6亿参数的“小…...

Gemma-3-12B-IT参数详解:Temperature与TopP协同调节创造可控随机性

Gemma-3-12B-IT参数详解:Temperature与TopP协同调节创造可控随机性 1. 引言:为什么我们需要“可控”的随机性? 如果你用过像Gemma-3-12B-IT这样的大语言模型,可能会发现一个有趣的现象:有时候它回答得特别严谨&#…...

嵌入式温度传感抽象层设计与实现

1. 项目概述nahs-Bricks-Feature-Temp是 NAHS-Bricks 模块化嵌入式平台中专用于温度传感功能的核心组件。NAHS-Bricks(Networked Autonomous Hardware System Bricks)是一套面向工业边缘节点、环境监测终端与分布式传感器网络的开源硬件抽象框架&#xf…...

嵌入式硬件项目技术文章创作规范

我无法处理与嵌入式硬件项目无关的内容。您提供的输入是一篇关于职场晋升的管理类文章,不符合我作为嵌入式硬件项目技术文章创作专家的角色定位和任务要求。 根据我的专业设定,我只能处理符合以下条件的输入: 来自嘉立创硬件开源平台的真实…...

MATLAB代码:“电力系统优化调度之机组组合”入门教程

MATLAB代码:机组组合 关键词:电力系统优化调度 机组组合 电力系统入门代码 参考文档:A computationally efficient mixed integer linear formulation for the thermal unit commitment problem 仿真平台:MATLAB YALMIPCPLEX 优势&#xff1a…...

Nanbeige 4.1-3B镜像免配置教程:预装依赖+自动模型缓存机制

Nanbeige 4.1-3B镜像免配置教程:预装依赖自动模型缓存机制 1. 项目介绍 Nanbeige 4.1-3B像素冒险聊天终端是一款专为中文对话优化的AI交互界面,将传统聊天机器人转变为充满游戏乐趣的冒险体验。这个镜像已经预装所有必要依赖,并采用智能缓存…...

Neo区块链智能合约测试框架完整指南:编写高质量测试用例的10个技巧

Neo区块链智能合约测试框架完整指南:编写高质量测试用例的10个技巧 【免费下载链接】neo 项目地址: https://gitcode.com/gh_mirrors/an/antshares Neo区块链测试框架是确保智能合约安全可靠的关键工具。作为领先的区块链平台,Neo提供了完善的单…...

ESP32硬件脉冲计数器库:PCNT外设深度封装与工业应用

1. 项目概述ESP32PulseCounter_Modified 是一个面向 Arduino 框架的轻量级硬件脉冲计数器封装库,专为 ESP32 系列 SoC 的 PCNT(Pulse Counter)外设模块深度定制。该库并非简单封装 ESP-IDF 原生 API,而是基于对 ESP32 脉冲计数硬件…...

零代码基础部署通义千问1.5-1.8B:vLLM推理引擎实战指南

零代码基础部署通义千问1.5-1.8B:vLLM推理引擎实战指南 1. 为什么选择通义千问1.5-1.8B-Chat-GPTQ-Int4? 如果你对AI大模型感兴趣,想自己动手部署一个能对话、能写代码、能回答问题的智能助手,但又担心技术门槛太高,…...

Lite-Avatar创新应用:虚拟展会导览系统开发

Lite-Avatar创新应用:虚拟展会导览系统开发 1. 引言 展会现场人山人海,找不到想看的展台?语言不通看不懂展品介绍?传统的展会导览往往需要大量人力,而且很难满足个性化需求。现在,通过Lite-Avatar技术&am…...

无需写代码!Llama Factory让大模型微调像搭积木一样简单

无需写代码!Llama Factory让大模型微调像搭积木一样简单 1. 大模型微调的新时代 传统的大语言模型微调往往需要编写大量代码,从数据预处理到训练脚本,再到效果评估,整个过程对非专业开发者来说门槛极高。而Llama Factory的出现彻…...

AIGlasses OS Pro 智能视觉系统 Python 入门实战:环境部署与图像识别初体验

AIGlasses OS Pro 智能视觉系统 Python 入门实战:环境部署与图像识别初体验 你是不是也对那些能“看懂”世界的AI应用感到好奇?比如手机相册自动识别人脸分类,或者商场里能统计客流量的摄像头。这些功能背后,往往离不开强大的智能…...

HP-Socket技术演讲内容结构模板:通用框架与调整建议

HP-Socket技术演讲内容结构模板:通用框架与调整建议 【免费下载链接】HP-Socket High Performance TCP/UDP/HTTP Communication Component 项目地址: https://gitcode.com/gh_mirrors/hp/HP-Socket HP-Socket是一款高性能跨平台网络通信框架,专为…...

丹青识画GPU利用率优化指南:FP16量化+动态批处理实测

丹青识画GPU利用率优化指南:FP16量化动态批处理实测 1. 优化背景与价值 在实际部署丹青识画系统时,我们发现GPU资源利用率存在明显瓶颈。当用户同时上传多张图片进行识别时,GPU使用率波动很大,有时满载有时空闲,这种…...

5个核心优势:OpenAI Java SDK快速集成AI能力指南

5个核心优势:OpenAI Java SDK快速集成AI能力指南 【免费下载链接】openai-java The official Java library for the OpenAI API 项目地址: https://gitcode.com/gh_mirrors/ope/openai-java 价值定位:为什么选择OpenAI Java SDK? 在A…...

用PANN模型识别鸟叫声:从环境音中分离特定声音的完整流程

用PANN模型识别鸟叫声:从环境音中分离特定声音的完整流程 清晨的森林录音中,鸟鸣往往与风声、虫鸣、流水声交织在一起。传统的声音识别技术很难从这种复杂环境音中准确分离特定物种的叫声。PANN(Pretrained Audio Neural Networks)模型的出现&#xff0c…...

字符串函数全解析:12 种核心函数的使用与底层模拟实现

1.字符分类函数 C语言中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符。这些函数的使用都需要包含一个头文件是ctype.h 字符分类函数总结(点击函数名可跳转至详细介绍)函数如果它的参数符合下列情况就返回真iscntrl…...