加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

魔法方法走进Python进阶学习大门

发布时间:2021-06-05 06:42:42 所属栏目:编程 来源:互联网
导读:事迹时候 collection.len()是面向工具说话的写法,len(collection)是Python说话的写法,这种气魄威风凛凛叫做Pythonic。以前者到后者,就像变把戏一样,一刹时让人面前一

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__(),就弄巧成拙了。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读