• python __getitem__()方法理解 python之使用魔术方法__getitem__和__len__


    参考:https://www.cnblogs.com/xiximayou/p/12164274.html

    在这我认为实例对象的key不管是否存在都会调用类中的__getitem__()方法。而且返回值就是__getitem__()方法中规定的return值。

    如果在类中定义了__getitem__()方法,那么他的实例对象(假设为P)就可以这样P[key]取值。当实例对象做P[key]运算时,就会调用类中的__getitem__()方法。

    # -*- 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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    getitem__和_getitem_,魔法方法就是在调用的使用是隐式的触发的

    (1)像__getitem__这种由两个双下划线构成的方法,被称为魔术方法。

    (2)魔术方法是为了给python解释器用的。当使用len(collection)时,实际上调用的就是collection._getitem__方法。而在使用obj[key]的形式来访问元素时,实际上调用的是object.getitem(key)方法。

    (3)魔术方法是属于类的方法,也就是说不需要实例化类就可以访问到该方法,同时,实例化的对象都可以访问到该方法。

    (4)使用__getitem__和__len__方法,我们就可以实现一个对自定义数据类型的迭代和访问。

    import collections
    Card = collections.namedtuple("Card",["rank","suit"])
    class FrenchDeck(object):
        ranks = [str(n) for n in range(2,11)] + list("JQKA")
        #黑桃 方块 红桃 梅花
        suits = "spades diamonds hearts clubs ".split()
        def __init__(self):
            self._cards = [Card(rank,suit) for rank in self.ranks
                           for suit in self.suits]
        def __getitem__(self, item):
            return self._cards[item]
        def __len__(self):
            return len(self._cards)
    复制代码
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    自定义的FrenchDeck类在重写了__getitem__和__len__方法之后,就可以对FrenchDeck实例化的对象进行类似于列表的操作。
    
    1.得到对象的长度
    
    deck = FrenchDeck()
    print(len(deck))
    输出:52
    
    2.通过下标来获列表元素
    
    print(deck[0])
    print(deck[-1])
    输出:
    
    Card(rank='2', suit='spades')
    Card(rank='A', suit='clubs')
    
    3.对列表进行遍历。当然也可以使用reversed方法进行翻转遍历
    
    for d in reversed(deck):
        print(d)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    拍卖许可证
    【LeetCode热题100】--347.前K个高频元素
    2023华为杯数学建模D题——碳排放路径优化基于指数分解法的LMDI 模型
    开发阶段部署
    网站后台删除文章时,如何把内容中的图片也一并删除?
    51单片机学习笔记_2 LED 模块
    RockChip RGA与DRM大小端命名冲突解析
    什么品牌的蓝牙耳机音质最好?音质好的蓝牙耳机推荐
    TeeChart for .NET 2023.10.19 Crack
    信息收集工具 -- weblive
  • 原文地址:https://blog.csdn.net/qq_15821487/article/details/126669566