python:“魔法“方法

ops/2025/3/13 12:47:21/

"魔法"方法

Python 中的魔法方法(Magic Methods) 是以双下划线开头和结尾的特殊方法(例如 __init____str__),用于定义类的特定行为(如运算符重载、迭代、上下文管理等)。

python 中方法名如果是 __xxxx__() 的,那么就有特殊的功能,因此叫做 魔法 方法:
__init__() 方法
__init__() 方法,在创建一个对象时默认被调用,不需要手动调用
__init__(self) 中,默认有1 个参数名字为 self ,如果在创建对象时传递了 2 个实参,那么 __init__(self) 中出了 self作为第一个形参外还需要 2 个形参,例如 __init__(self,x,y)
__init__(self) 中的self 参数,不需要开发者传递, python 解释器会自动把当前的对象引用传递进去
__str__(self) 方法
__str__(self) 方法,当使用print 输出对象的时候,只要自己定义了 __str__(self) 方法,那么就会打印从在这个方法中 return 的数据

作用、调用和命名

  • 核心作用:魔法方法让自定义类具备与内置类型一致的行为。

  • 调用方式:通常由 Python 解释器隐式调用(如 a + b 触发 __add__)。

  • 命名规范:严格遵循双下划线开头和结尾的格式(如 __xxx__)。

最佳实践

  1. 优先实现必要的魔法方法(如 __init____str__)。

  2. 保持行为一致性:例如,实现 __eq__ 时最好同时实现 __hash__

  3. 避免滥用运算符重载,确保操作符行为符合直觉。


    常见的魔法方法分类及说明:

    1. 初始化与构造

    方法说明示例
    __new__(cls, ...)创建实例时调用(先于 __init__),返回实例对象。obj = MyClass()
    __init__(self, ...)初始化实例属性,构造对象时调用。def __init__(self, x): self.x = x
    __del__(self)对象被销毁时调用(垃圾回收触发)。del obj

    2. 运算符重载

    方法对应的运算符或操作示例
    __add__(self, other)+a + b → a.__add__(b)
    __sub__(self, other)-a - b → a.__sub__(b)
    __mul__(self, other)*a * b → a.__mul__(b)
    __eq__(self, other)==a == b → a.__eq__(b)
    __lt__(self, other)<a < b → a.__lt__(b)
    __str__(self)定义对象的字符串表示(供 print() 或 str() 使用)。print(obj) → 调用 obj.__str__()
    __repr__(self)定义对象的官方字符串表示(供 repr() 或交互式环境显示)。repr(obj) → obj.__repr__()
    __bool__(self)定义对象的布尔值(if obj: 时触发)。if obj: → obj.__bool__()

    3. 容器类行为

    方法说明示例
    __len__(self)返回容器长度(len(obj) 时调用)。len(obj) → obj.__len__()
    __getitem__(self, key)获取元素(obj[key] 时调用)。obj[0] → obj.__getitem__(0)
    __setitem__(self, key, value)设置元素(obj[key] = value 时调用)。obj[0] = 5 → obj.__setitem__(0, 5)
    __iter__(self)返回迭代器对象(for x in obj 时调用)。iter(obj) → obj.__iter__()
    __next__(self)迭代时获取下一个值(需与 __iter__ 配合使用)。next(iter(obj))
    __contains__(self, item)检查是否包含元素(item in obj 时调用)。5 in obj → obj.__contains__(5)

    4. 上下文管理

    方法说明示例
    __enter__(self)进入上下文时调用(with 语句开始时)。with obj as x: → obj.__enter__()
    __exit__(self, exc_type, exc_val, traceback)退出上下文时调用(清理资源)。with 块结束后调用

    5. 属性访问与描述符

    方法说明示例
    __getattr__(self, name)访问不存在的属性时调用。obj.x(若 x 不存在)
    __setattr__(self, name, value)设置属性时调用。obj.x = 5 → obj.__setattr__('x', 5)
    __delattr__(self, name)删除属性时调用。del obj.x → obj.__delattr__('x')
    __getattribute__(self, name)访问任何属性时调用(优先级高于 __getattr__)。obj.x → obj.__getattribute__('x')
    __dir__(self)返回对象的属性列表(dir(obj) 时调用)。dir(obj) → obj.__dir__()

    6. 描述符协议(用于自定义属性行为)

    方法说明
    __get__(self, instance, owner)获取属性值时调用(用于描述符类)。
    __set__(self, instance, value)设置属性值时调用(用于描述符类)。
    __delete__(self, instance)删除属性时调用(用于描述符类)。

    7. 反射与自省

    方法说明
    __instancecheck__(self, instance)自定义 isinstance(instance, cls) 的行为。
    __subclasscheck__(self, subclass)自定义 issubclass(subclass, cls) 的行为。

    8. 数值类型扩展

    方法说明
    __int__(self)定义对象转换为整数时的行为(int(obj))。
    __float__(self)定义对象转换为浮点数时的行为(float(obj))。
    __complex__(self)定义对象转换为复数时的行为。

    9. 协程与异步

    方法说明
    __await__(self)定义异步迭代器的行为(async for 中使用)。
    __aiter__(self)返回异步迭代器对象(async for 时调用)。
    __anext__(self)异步迭代时获取下一个值。

    其他重要方法

    方法说明
    __call__(self, ...)允许实例像函数一样被调用(obj() 时触发)。
    __slots__限制类实例的属性(节省内存)。
    __hash__(self)定义对象的哈希值(hash(obj) 时调用,用于字典键或集合元素)。


http://www.ppmy.cn/ops/165420.html

相关文章

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_02带边框和斑马纹的固定表头表格

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

Python从基础开发到前沿技术完整生态(应用技术栈)(2025版)

Python作为一门通用编程语言&#xff0c;应用领域极其广泛&#xff0c;以下是其核心应用场景及对应的工具组合&#xff0c;涵盖从基础开发到前沿技术的完整生态&#xff1a; 一、Web全栈开发 场景案例&#xff1a;构建高并发电商平台&#xff08;用户系统商品推荐支付接口&…

2021-05-28 C++自己写一个strcmp函数

规则 当s1<s2时&#xff0c;返回为负数-1&#xff1b; 当s1s2时&#xff0c;返回值 0&#xff1b; 当s1>s2时&#xff0c;返回正数1。 即&#xff1a;两个字符串自左向右逐个字符相比&#xff08;按ASCII值大小相比较&#xff09;&#xff0c;直到出现不同的字符或遇…

二级Python通关秘籍:字符串操作符/函数/方法全解析与实战演练

第一章 字符串基础概念与运算符速通 1.1 字符串的不可变性特性 在Python中&#xff0c;字符串被设计为immutable类型&#xff0c;任何修改操作都会生成新对象。这一特性直接影响字符串拼接的性能表现&#xff0c;建议使用join()方法代替多次操作。 1.2 基础操作符全掌握 pyt…

Spring Boot 接口延迟响应的实现与应用场景

文章目录 学习文章&#xff1a;Spring Boot 接口延迟响应的实现与应用场景 一、Spring Boot 接口延迟响应的实现1. 创建Spring Boot项目2. 编写控制器3. 运行项目 二、延迟响应的应用场景1. 测试超时处理2. 模拟网络延迟3. 调试异步任务4. 性能测试 三、注意事项1. 性能影响2. …

[高阶技术了解]WebRPC详解

“webrpc详解”&#xff0c;我需要根据我搜索到的资料来回答这个问题。首先&#xff0c;得弄清楚webrpc到底是什么。根据&#xff0c;Webrpc是一个模式驱动的后端服务开发工具&#xff0c;允许通过RIDL或JSON模式文件生成代码&#xff0c;支持多种语言如Go、TypeScript等。它类…

【技海登峰】Kafka漫谈系列(六)Java客户端之消费者Consumer核心概念与客户端配置详解

【技海登峰】Kafka漫谈系列(六)Java客户端之消费者Consumer核心概念与客户端配置详解 在上篇文章 【技海登峰】Kafka漫谈系列(五)Java客户端之生产者Producer核心组件与实现原理剖析 中我们介绍了生产者相关的内容。消费者同生产者客户端一样,在kafka-clients中消费者客户…

DeepSeek一键生成可视化看板

在当今数据驱动的时代&#xff0c;数据可视化已成为企业决策和分析的关键工具。然而&#xff0c;传统的数据可视化过程往往需要专业的技术知识和大量的时间成本&#xff0c;这对于许多非技术人员来说是一个巨大的挑战。不过&#xff0c;现在有了DeepSeek&#xff0c;这一切都变…