关于python中的len(collection)

双下方法: 两个下划线开始并结束的方法 如__init__ , __getitem__方法

问题 :对于python中的List类,我们可以通过len([1,2,3])获取长度,这是获取python内置的数据结构的长度,那如果对于自定义的类,要怎么获取长度呢

对于这个问题,我们要知道,在python遇到特殊语法时,会使用特殊方法去激活对象的操作,这些特殊方法就是python中的双下方法。比如_len_ ,和_getitem_

因此对于自定义类,我们要让对象具有具有len, in, for等能力, 就要实现对应的_len__, __contains_, __iter___方法

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]
    def __iter__(self):
        """返回纸牌迭代器
        """        
        return iter(self._cards)

使用:

deck = FrenchDeck()
#获取纸牌长度
print(len(deck))
#通过__getitem__获得纸牌
#获取第一张纸牌
deck[0]
#获取最后一张纸牌
deck[-1]
#遍历纸牌
for card in deck:
    print(card)
#通过迭代器获取纸牌
it = iter(deck)
print(next(it))
print(next(it))

以上就是双下方法的使用方式,既然双下方法是由python内置方法调用,所以我们在自定义方法时不可能使用双下划线

除了以上举例的双下方法,还有以下功能可以用过双下方法实现,有兴趣的可以试一下

  • 迭代
  • 集合类
  • 属性访问
  • 运算符重载
  • 函数和方法的调用
  • 对象的创建和销毁
  • 字符串表示形式和格式化
  • 管理上下文(即 with 块)

本文介绍了len(collection)方法的实质是通过调用类内部的双下方法实现的,理解这点有助于编写python风格的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值