魔法方法走进Python进阶学习大门
collection.len()是面向对象语言的写法,len(collection)是Python语言的写法,这种风格叫做Pythonic。从前者到后者,就像变魔术一样,一瞬间让人眼前一亮。这个魔术就是Python魔法方法,或者叫双下方法,它是用双下划线开头和双下划线结尾的特殊方法,比如obj[key],Python解释器实际上会转换成obj.__getitem__(key)来运行,但是使用者并无感知。 __getitem__和__len ____getitem__用来获取数据,__len__用来返回长度,这2个魔法方法是Python基础,我们通过一副扑克牌来了解: import collections
# 定义一副牌 Card = collections.namedtuple('Card', ['rank', 'suit'])
class FrenchDeck: # 大小 ranks = [str(n) for n in range(2, 11)] + list('JQKA') # 花色 suits = 'spades diamonds clubs hearts'.split()
def __init__(self): # 生成一副牌 self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]
def __len__(self): return len(self._cards)
def __getitem__(self, position): return self._cards[position] 本来我们对这副牌什么都不能做,但是由于实现了__len__,可以使用len()函数查看有多少张牌: >>> len(deck) 52 由于实现了__getitem__,可以使用中括号索引取值: >>> deck[0] Card(rank='2', suit='spades') 能进行切片: >>> deck[:3] [Card(rank='2', suit='spades'), Card(rank='3', suit='spades'), Card(rank='4', suit='spades')] >>> deck[12::13] [Card(rank='A', suit='spades'), Card(rank='A', suit='diamonds'), Card(rank='A', suit='clubs'), Card(rank='A', suit='hearts')] 能迭代: >>> for card in deck: # doctest: +ELLIPSIS ... print(card) Card(rank='2', suit='spades') Card(rank='3', suit='spades') Card(rank='4', suit='spades') ... 发现没有,魔法方法是可以用来装B的!别人写个类只能get、set,你写个类还能花式炫技,666。 Python魔法方法是给Python解释器使用的,一般不需要直接调用,Python会自己去调,比如把len(my_object)写成my_object.__len__(),就弄巧成拙了。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |