加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

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

发布时间:2021-06-02 09:30:36 所属栏目:语言 来源:互联网
导读:奇迹时刻 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__(),就弄巧成拙了。

(编辑:辽源站长网)

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

    推荐文章
      热点阅读