Magic 和 Dunder
指: Python中一双下划线包围的特殊方法,比如
__len__
,__iter__
等,这类特殊方法又称作Dunder method
,Magic method
(魔法方法)是Python中特殊方法的昵称
特点
特殊方法的存在是为了被Python解释器调用,你自己无需调用它们,可以通过内置方法,比如len
,iter
,str
等来间接使用特殊方法.
实现一摞Python风格的纸牌
1 | import collections |
nametuple
又叫做具名元组
可以实现具有名字的元组或则具有名字的类,该类中只有属性,没有方法,本处就是利用具名元组
实现Card
类
1 | desk = FrenchDesk() |
结果1
Card(rank='7', suit='spandes')
1 | # 输出desk类信息 |
结果1
FrenchDesk类信息
1 | from random import choice |
结果1
Card(rank='4', suit='hearts')
1 | # 由于实现__getitem__,FrenchDesk类具有列表的性质 |
结果
1 | [Card(rank='3', suit='spandes'), |
1 | # 实现排序 |
结果1
2
3
4
5
6
7
8
9Card(rank='2', suit='clubs')
Card(rank='2', suit='diamonds')
Card(rank='2', suit='hearts')
Card(rank='2', suit='spandes')
...
Card(rank='A', suit='clubs')
Card(rank='A', suit='diamonds')
Card(rank='A', suit='hearts')
Card(rank='A', suit='spandes')
1 | # 洗牌,打乱FreachDesk.__cards内部顺序 |
结果1
2
3
4
5[Card(rank='2', suit='clubs'),
Card(rank='10', suit='clubs'),
Card(rank='8', suit='clubs'),
Card(rank='A', suit='spandes'),
Card(rank='9', suit='hearts')]
1 | shuffle(desk) |
结果1
2
3
4
5[Card(rank='6', suit='hearts'),
Card(rank='6', suit='spandes'),
Card(rank='J', suit='hearts'),
Card(rank='2', suit='diamonds'),
Card(rank='9', suit='clubs')]
实现向量运算
1 | from math import hypot |
1 | vector = Vector(3,5) |
1 | Vector(3,5) |
1 | # 加法 |
1 | Vector(12,-2) |
1 | # 乘法 |
1 | Vector(36,-35) |
1 | # 求模 |
1 | 5.830951894845301 |
1 | bool(vector) |
1 | True |
总结
对于一个自建的类可以通过实现特殊方法
来让类具有list
,可迭代
等特性.使自建类能表现的跟内置类一样,甚至功能更多.