加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_汕头站长网 (https://www.0754zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

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

发布时间:2022-12-06 12:39:24 所属栏目:语言 来源:
导读:  collection.len()是面向对象语言的写法,len(collection)是Python语言的写法,这种风格叫做Pythonic。从前者到后者,就像变魔术一样,一瞬间让人眼前一亮。这个魔术就是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__(),就弄巧成拙了。
 

(编辑:云计算网_汕头站长网)

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