python 中的魔术方法 getitem setitem

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010339879/article/details/85376883

python 中的魔术方法 getitem setitem

https://docs.python.org/3/reference/datamodel.html?highlight=iter#object.__getitem__
https://blog.csdn.net/weixin_42557907/article/details/81589574

class Tag:
    """


    tag = Tag()
    tag['name']  --->   __getitem__

    """

    def __getitem__(self, item):
        """

        :param item:
        :return:
        """
        print(f'__getitem__({item})  is  called.')
        return 2


def test_tag():
    tag = Tag()

    # __getitem__ is called
    print(tag['name'])  # 2
    print(tag['frank'])  # 2
    print(tag['laoda'])  # 2


if __name__ == '__main__':
    test_tag()

__getitem__ 这个方法被调用的时候 是执行 tag[key]的时候,

  • __setitem__

这个方法 是 怎么用呢?

当实例 instance[‘key’] =‘frank’ ,这个时候会被调用.


class Tag:
    """


    tag = Tag()

    tag['name']  --->   __getitem__

    tag['name'] ='frank'   ----> __setitem__

    """

    def __getitem__(self, item):
        """

        :param item:
        :return:
        """
        print(f'__getitem__({item})  is  called.')
        return self.__dict__[item]

    def __setitem__(self, key, value):
        print("__setitem__:Set %s Value %s" % (key, value))

        self.__dict__[key] = value




if __name__ == '__main__':
    tag = Tag()

    #  __setitem__ 被调用
    tag['name'] = 'frank'
    tag['laoda'] = 'liuxiaolu'
    tag['laoer'] = 'lile'
    tag['laosan'] = 'weiliang'

    # __getitem__  被调用
    print(tag['name'])
    print(tag['laoda'])
    print(tag['laoer'])
    print(tag['laosan'])

result:

__setitem__:Set name Value frank
__setitem__:Set laoda Value liuxiaolu
__setitem__:Set laoer Value lile
__setitem__:Set laosan Value weiliang
__getitem__(name)  is  called.
frank
__getitem__(laoda)  is  called.
liuxiaolu
__getitem__(laoer)  is  called.
lile
__getitem__(laosan)  is  called.
weiliang

  • __delitem__ 这个魔术方法 是什么时候调用呢?

删除一个 实例的属性的时候

比如 说 : del tag[‘name’] 就会调用 这个方法__delitem__

class Tag:
    """
    tag = Tag()

    tag['name']  --->   __getitem__

    tag['name'] ='frank'   ----> __setitem__

    del tag['name']  ---->  __delitem__
    """

    def __getitem__(self, item):
        """

        :param item:
        :return:
        """
        print(f'__getitem__({item}) is  called.')
        return self.__dict__[item]

    def __setitem__(self, key, value):
        print(f"__setitem__:Set {key},Value {value}")

        self.__dict__[key] = value

    def __delitem__(self, key):
        print(f"__delitem__({key}) is called")
        del self.__dict__[key]




if __name__ == '__main__':
    tag = Tag()

    #  __setitem__ 被调用
    tag['name'] = 'frank'
    tag['laoda'] = 'liuxiaolu'
    tag['laoer'] = 'lile'
    tag['laosan'] = 'weiliang'

    # __getitem__  被调用
    print(tag['laosan'])

    #  __delitem__  被调用
    del tag['laosan']

    try:
        print(tag['laosan'])
    except KeyError:
        print('key error occurred.')

result:

__setitem__:Set name,Value frank
__setitem__:Set laoda,Value liuxiaolu
__setitem__:Set laoer,Value lile
__setitem__:Set laosan,Value weiliang
__getitem__(laosan)  is  called.
weiliang
__delitem__(laosan) is called
__getitem__(laosan)  is  called.
key error occurred.

总结

python 中有很多魔术方法,主要探讨了__getitem__ , __setitem__ , __delitem__
这些魔术方法的基本使用. 其实 很多时候 有一些库里会使用这些魔术方法,这个时候 要去理解他们为什么 要实现这些方法, 这个就是python 的特性了, 需要不断的学习吧.
推荐阅读有一个实现
https://github.com/requests/requests/blob/master/requests/structures.py
CaseInsensitiveDict 对大小写不敏感的字典的实现,里面就有用了这几个魔术方法.

参考文档

https://github.com/requests/requests/blob/master/requests/structures.py
https://docs.python.org/3/reference/datamodel.html?highlight=iter#object.__getitem__
https://blog.csdn.net/weixin_42557907/article/details/81589574

分享快乐,留住感动. 2018-12-30 19:30:39 --frank

猜你喜欢

转载自blog.csdn.net/u010339879/article/details/85376883