【Python】Python对象通过[]取值

正常来说[]只能用于数组取值和切片,但是在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对象),如果是的话取得切片开始索引、切片结束索引以及切片步长 (这里没有写步长),然后即可根据取得的索引形成自己所需的功能。

猜你喜欢

转载自blog.csdn.net/weixin_42147967/article/details/123925052