Python基础(⑦魔法方法)

1. init:初始化实例

作用:创建实例时自动调用,用于初始化对象的属性。

注意:它不是构造函数(真正创建对象的是 new),而是初始化已创建的对象。

python 复制代码
class Person:
    # 初始化方法:接收参数并赋值给实例属性
    def __init__(self, name, age):
        self.name = name  # 实例属性
        self.age = age

# 创建实例时,参数会传给 __init__
p = Person("张三", 25)
print(p.name)  # 输出:张三
print(p.age)   # 输出:25

2. str:实例的字符串表示(面向用户)

作用:当用 print() 打印实例,或用 str() 转换实例时,会自动调用该方法。

目标:返回一个 "用户友好" 的字符串,方便人类阅读。

python 复制代码
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    # 定义实例的字符串表示
    def __str__(self):
        return f"Person(name='{self.name}', age={self.age})"

p = Person("张三", 25)
print(p)       # 输出:Person(name='张三', age=25)(自动调用 __str__)
print(str(p))  # 输出:同上(手动调用 str() 触发)

如果不定义 __str__,默认会返回类似 <__main__.Person object at 0x000001> 的内存地址。

3. repr:实例的字符串表示(面向开发者)

作用:当在交互式环境中直接输入实例,或用 repr() 转换时,会自动调用。

目标:返回一个 "开发者友好" 的字符串,通常能完整描述对象的构造信息(最好能通过 eval() 重建对象)。

python 复制代码
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    # 面向开发者的字符串表示
    def __repr__(self):
        return f"Person('{self.name}', {self.age})"  # 可以直接用于创建对象

p = Person("张三", 25)
p  # 交互式环境中输出:Person('张三', 25)(自动调用 __repr__)
print(repr(p))  # 输出:同上(手动调用 repr() 触发)

4. call:让实例可被调用

作用:定义该方法后,实例可以像函数一样被调用(用 () 触发)。

用途:让对象具备函数的行为,常用于实现 "可调用对象"。

python 复制代码
class Calculator:
    def __init__(self, base):
        self.base = base  # 基础值
    
    # 定义实例被调用时的行为
    def __call__(self, x):
        return self.base + x  # 每次调用时,返回基础值 + 参数

# 创建实例
calc = Calculator(10)

# 实例像函数一样被调用(触发 __call__)
print(calc(5))   # 输出:15(10 + 5)
print(calc(20))  # 输出:30(10 + 20)

这相当于把实例变成了一个 "带状态的函数",比普通函数更灵活。

方法 触发时机 核心作用
__init__ 创建实例时 初始化实例属性
__str__ print(实例) 或 str(实例) 返回用户友好的字符串
__repr__ 直接输入实例或 repr(实例) 返回开发者友好的字符串(可重现)
__call__ 实例被当作函数调用(实例()) 让实例具备函数的调用行为
相关推荐
YSL0701245 分钟前
一文通关-----栈和队列
开发语言·数据结构
维克兜率天15 分钟前
【维克】统计套利建模:从因子到信号的完整流程
android·开发语言·python·算法·kotlin
全栈练习生18 分钟前
RAG 准确率提升体系化方案
python·ai
Pin_Qing20 分钟前
同一天,谷歌半价卖旗舰,阶跃翻倍收缓存
大数据·开发语言·人工智能·程序人生·缓存
用户76241175670523 分钟前
第十一章 GUI界面编程
python
天天被压力25 分钟前
【Python量化实战宝典 #03】指数与板块行情接口全拆解:大盘·行业·概念一键取(Python 可跑)
java·人工智能·python
2501_9307077826 分钟前
使用C#代码在 Word 文档中添加、插入或删除页面
开发语言·c#·word
小马不起床26 分钟前
第七阶段:数据存储与部署
数据库·python
没有梦想的咸鱼185-1037-166329 分钟前
从通量数据到SCI论文——AI-R语言生态系统碳水热通量及其机制分析与论文
开发语言·人工智能·数据分析·r语言
weixin_4617694035 分钟前
conda create 创建容器 Failed to resolve ‘repo.anaconda.com‘问题
开发语言·python·conda·repo·网络问题·无法创建