【小学生都能看懂的Python入门教程】第五章:魔法方法——解锁新技能:Python界的霍格沃茨课程
魔法方法——解锁新技能:Python界的霍格沃茨课程
一、魔法方法揭秘:Python的后台通行证
1. 什么是魔法方法?
魔法方法是Python中的特殊方法,以双下划线开头和结尾(如__init__
)。它们就像代码世界的咒语,让对象获得超能力:
class Wizard:
def __init__(self, name):
self.name = name # 初始化咒语
def __str__(self):
return f"🧙♂️ {self.name}" # 变形咒
print(Wizard("赫敏")) # 输出:🧙♂️ 赫敏
冷知识:当你使用print(obj)
时,Python悄悄调用了obj.__str__()
,就像给对象施了显形咒
二、常见魔法咒语手册
1. 基础三件套
魔法方法 | 触发场景 | 生活类比 |
---|---|---|
__init__ | 对象创建时 | 婴儿的出生证明 |
__str__ | 被打印时 | 个人简历 |
__len__ | 使用len()时 | 测量身高 |
class MagicList:
def __init__(self, items):
self.data = list(items)
def __len__(self):
return len(self.data) * 2 # 魔法让长度翻倍
def __str__(self):
return "✨" + "→".join(self.data) + "✨"
my_list = MagicList(["苹果", "香蕉"])
print(len(my_list)) # 输出:4(实际2个元素)
print(my_list) # 输出:✨苹果→香蕉✨
2. 算术魔法
魔法方法 | 运算符 | 效果 |
---|---|---|
__add__ | + | 加法 |
__sub__ | - | 减法 |
__mul__ | * | 乘法 |
__truediv__ | / | 除法 |
class MagicNumber:
def __init__(self, value):
self.value = value
def __add__(self, other):
return self.value - other.value # 叛逆加法
a = MagicNumber(10)
b = MagicNumber(3)
print(a + b) # 输出:7(其实是10-3)
三、高阶黑魔法:让你的对象无所不能
1. 容器类魔法
class PandoraBox:
def __getitem__(self, index):
return f"你打开了第{index}层,获得:{['诅咒','金币','猫'][index%3]}"
box = PandoraBox()
print(box[5]) # 输出:你打开了第5层,获得:猫
2. 调用魔法
class TimeMachine:
def __call__(self, year):
return f"咻!穿越到{year}年,{['小心恐龙','记得买房'][year>2000]}"
tm = TimeMachine()
print(tm(2020)) # 输出:咻!穿越到2020年,记得买房
四、实战演练:魔法数字实验室
需求说明
- 创建魔法数字对象
- 自定义数学运算规则
- 实现表情符号转换
- 支持长度测量
代码全解析
class MagicNumber:
def __init__(self, value):
self.value = value
def __add__(self, other):
# 让加法变成拼接操作
return MagicNumber(int(f"{self.value}{other.value}"))
def __sub__(self, other):
# 减法变成爱心发射
return "❤️" * abs(self.value - other.value)
def __str__(self):
# 数字转表情符号
emoji_map = {"0":"⭕", "1":"☝️", "2":"✌️", "3":"🤟", "4":"🖖", "5":"🖐️"}
return "".join(emoji_map.get(c, "❓") for c in str(self.value))
def __len__(self):
# 长度等于各位数字之和
return sum(int(c) for c in str(self.value))
def __contains__(self, num):
# 判断数字是否包含特定数字
return str(num) in str(self.value)
# 魔法实验时间
a = MagicNumber(12)
b = MagicNumber(3)
print(a + b) # 输出:<__main__.MagicNumber object>(需要print才能看到效果)
print(a - b) # 输出:❤️❤️❤️❤️❤️❤️❤️❤️❤️
print(a) # 输出:☝️✌️
print(len(a)) # 输出:3 (1+2)
print(2 in a) # 输出:True
魔法效果展示:
>>> print(MagicNumber(123) + MagicNumber(45))
🤟✌️🖐️ # 实际值是12345的符号表示
>>> print(MagicNumber(5) - MagicNumber(10))
❤️❤️❤️❤️❤️
五、魔法方法冷知识
__new__
才是真正的构造函数(__init__
只是初始化)__del__
是对象的临终关怀方法(但不建议依赖它)__getattr__
可以处理不存在的属性访问__slots__
能限制对象属性,节省内存(像给对象穿紧身衣)
为什么叫魔法方法?
因为它们让代码像被施了魔法一样自动运作,而普通程序员永远不知道咒语何时生效
结语:从麻瓜到魔法师的蜕变
现在你已经掌握:
✅ 魔法方法的基本原理
✅ 常见魔法方法的使用
✅ 高阶魔法的应用场景
✅ 魔法数字实验室的构建
当你能让对象自动响应各种操作时,就真正进入了Python的魔法世界。记住,强大的魔法伴随着责任——不要滥用魔法方法,否则你的代码会变得像《哈利波特》中的韦斯莱魔法把戏一样难以控制!
下期预告:《迭代器——成为自己的“导游”:代码世界的行程规划师》
课后彩蛋:在MagicNumber类中添加以下方法:
def __invert__(self):
return MagicNumber(int(str(self.value)[::-1]))
# 试试 print(~MagicNumber(123)) 看看效果
代码学习,前言技术分享,深度分析编程技术,普及科普编程技术,天天都要敲代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)