正常来说[]只能用于数组取值和切片,但是在Python中一切皆对象,及数组也是个对象,那么为什么数组对象可以用[]取值而自定义的对象不能呢?
这里就涉及到类中的特殊方法,__getitem__和__setitem__方法了。
先给出代码,这里手动实现了一个简单的字典功能
class MyDict(object):
def __init__(self, seq=None):
self.__keysList = []
self.__valuesList = []
if seq:
for k, v in seq:
self.__keysList.append(k)
self.__valuesList.append(v)
def get(self, key, default=None):
try:
return self.__valuesList[self.__keysList.index(key)]
except ValueError:
return default
def __getitem__(self, key):
if isinstance(key, slice):
return self.__keysList[key]
return self.__valuesList[self.__keysList.index(key)]
def __setitem__(self, key, value):
try:
self.__valuesList[self.__keysList.index(key)] = value
except ValueError:
self.__keysList.append(key)
self.__valuesList.append(value)
d = MyDict([(1, 2), (3, 4), (5, 6)])
d[7] = 8
print(d[5])
print(d[0:2])
在__getitem__中,可以通过参数key来返回对应值,调用的时候将[]中的值传入key;
在__setitem__中,可以通过key和value来设置对应值,调用的时候将[]中的值传入key,将等号后面的值传入value;
另外介绍一下切片 (slice) 功能,首先判断key是否是slice的实例 (在Python中,a: b或a: b: c的写法自动生成slice对象),如果是的话取得切片开始索引、切片结束索引以及切片步长 (这里没有写步长),然后即可根据取得的索引形成自己所需的功能。