魔法方法走进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__(),就弄巧成拙了。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |