前言
如果在类中定义了__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
去期待陌生,去拥抱惊喜。