1. 程式人生 > >python 中的魔術方法 getitem setitem

python 中的魔術方法 getitem setitem

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