参考: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
(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)