前言

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

当实例对象做P[key]运算时,就会调用类中的__getitem__()方法。

示例1

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

# -*- 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

示例2:利用P['k']方式获取实例对象的属性

A类的实例A()可以通过点的方式获取到属性【类的实例对象属性是构造方法中的初始化实例对象的属性】:

class A(object):

count = 0

def __init__(self):
self.name = "gogo"
self.age = 18

def start(self):
print("start1111111")

a = A()
print(a.count)
print(a.name)

如果想实现a['name']这种方式取值,在类中定义 __getitem__() 方法就可以实现:

class A(object):

count = 0

def __init__(self):
self.name = "gogo"
self.age = 18

def start(self):
print("start1111111")

def __getitem__(self, item):
return object.__getattribute__(self, item)

# 通过实例对象.属性获取属性
a = A()
print(a.count)
print(a.name)

# 通过[key]语法调用属性
print(a['count'])
print(a['age'])
print(a['start'])
print(a['start']())

运行结果:

0
gogo
0
18
<bound method A.start of <__main__.A object at 0x0000027CC08D96D8>>
start1111111
None

示例三:[Python的魔法方法​​__getitem__​​ 可以让对象实现迭代功能:即将实例对象转换为可迭代对象]

Python的魔法方法 __getitem__() 可以让对象实现迭代功能,这样就可以使用​​for...in...​​ 来迭代该对象了

class Animal:
def __init__(self, animal_list):
self.animals_name = animal_list

animals = Animal(["dog","cat","fish"])
for animal in animals:
print(animal)

在用 ​​for..in..​​​ 迭代对象时,如果对象没有实现 ​​__iter__​​​ ,​​__next__​​​ 迭代器协议,Python的解释器就会去寻找​​__getitem__​​​ 来迭代对象,如果连​​__getitem__​​ 都没有定义,这解释器就会报对象不是迭代器的错误:

TypeError: 'Animal' object is not iterable

而实现这个方法后,就可以正常迭代对象了。

class Animal:
def __init__(self, animal_list):
self.animals_name = animal_list

def __getitem__(self, index):
return self.animals_name[index]


animals = Animal(["dog", "cat", "fish"])
for animal in animals:
print(animal)

a = Animal(["dog", "cat", "fish"])[0]
b = Animal(["dog", "cat", "fish"])[1]
c = Animal(["dog", "cat", "fish"])[2]
print('\n')
print(a, b, c, sep='\n')

运行结果:

dog
cat
fish

dog
cat
fish

 

去期待陌生,去拥抱惊喜。