python __getitem__()方法理解 python之使用魔术方法__getitem__和__len__

344 篇文章 11 订阅
本文介绍了Python中类的__getitem__和__len__魔术方法,这两个方法允许自定义类型的行为类似列表。通过__getitem__,实例可以使用索引来获取值,如`data[2]`,而__len__则返回对象的长度,例如`len(deck)`。示例中展示了如何在FrenchDeck类中实现这些方法,使其支持像列表一样的操作,如获取长度、索引访问和遍历。
摘要由CSDN通过智能技术生成

参考:https://www.cnblogs.com/xiximayou/p/12164274.html

在这我认为实例对象的key不管是否存在都会调用类中的__getitem__()方法。而且返回值就是__getitem__()方法中规定的return值。

如果在类中定义了__getitem__()方法,那么他的实例对象(假设为P)就可以这样P[key]取值。当实例对象做P[key]运算时,就会调用类中的__getitem__()方法。

# -*- coding:utf-8 -*-
class DataTest:
    def __init__(self,id,address):
        self.id=id
        self.address=address
        self.d={self.id:1,
                self.address:"192.168.1.1"
                }
        
    def __getitem__(self,key):
        return "hello"
    
 
data=DataTest(1,"192.168.2.11")
print data[2]

输出结果为:
hello

getitem__和_getitem_,魔法方法就是在调用的使用是隐式的触发的

(1)像__getitem__这种由两个双下划线构成的方法,被称为魔术方法。

(2)魔术方法是为了给python解释器用的。当使用len(collection)时,实际上调用的就是collection._getitem__方法。而在使用obj[key]的形式来访问元素时,实际上调用的是object.getitem(key)方法。

(3)魔术方法是属于类的方法,也就是说不需要实例化类就可以访问到该方法,同时,实例化的对象都可以访问到该方法。

(4)使用__getitem__和__len__方法,我们就可以实现一个对自定义数据类型的迭代和访问。

import collections
Card = collections.namedtuple("Card",["rank","suit"])
class FrenchDeck(object):
    ranks = [str(n) for n in range(2,11)] + list("JQKA")
    #黑桃 方块 红桃 梅花
    suits = "spades diamonds hearts clubs ".split()
    def __init__(self):
        self._cards = [Card(rank,suit) for rank in self.ranks
                       for suit in self.suits]
    def __getitem__(self, item):
        return self._cards[item]
    def __len__(self):
        return len(self._cards)
复制代码
自定义的FrenchDeck类在重写了__getitem__和__len__方法之后,就可以对FrenchDeck实例化的对象进行类似于列表的操作。

1.得到对象的长度

deck = FrenchDeck()
print(len(deck))
输出:52

2.通过下标来获列表元素

print(deck[0])
print(deck[-1])
输出:

Card(rank='2', suit='spades')
Card(rank='A', suit='clubs')

3.对列表进行遍历。当然也可以使用reversed方法进行翻转遍历

for d in reversed(deck):
    print(d)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值