Python魔法之__getitem__

Python魔法之__getitem__

上篇文章探讨了__call__魔法方法,这里探讨__getitem__的奇妙之处。

Python中的对象分为可迭代对象与不可迭代对象,那么什么是可迭代对象呢?

可以这样简单地说,可以使用for i in obj进行遍历的对象均为可迭代对象,不能用for i in obj进行遍历的就是不可迭代对象。

因此range(n)、list、tuple、str、dict等均为可迭代对象,而int、float与一般的函数对象、类对象等是不可迭代对象。

可迭代对象之所以可迭代,就是因为内部实现了__iter____getitem__魔法方法

  1. 如果不定义__getitem__

    class MyList:
        def __init__(self,len:int):
            self.list=[i for i in range(len)]
            self.length=len
    
        def __repr__(self)->str:
            return f"MyList({self.length}):{self.list}"
    
    x=MyList(10)
    x[7]
    

    结果报错,显示MyList不可以通过下标访问:

    Traceback (most recent call last):
      File "d:\Github-Projects\Crack_Detection_Daily\He\env.py", line 14, in <module>
        x[7]
    TypeError: 'MyList' object is not subscriptable
    
  2. 定义__getitem__

    from numpy import iterable
    class MyList:
        def __init__(self, len: int):
            self.list = [i for i in range(len)]
            self.length = len
    
        def __getitem__(self, index: int) -> int:
            return self.list[index]
    
        def __repr__(self) -> str:
            return f"MyList({self.length}):{self.list}"
    
    x = MyList(10)
    print(x[7])
    print(x.__getitem__(7))
    print(iterable(x))
    print(x[7] is x.__getitem__(7))
    for i in x:
        print(i,end=' ')
    

    注:numpy.iterable(x)可以判断x是否为可迭代对象

    输出为:

    7
    7
    True
    True
    0 1 2 3 4 5 6 7 8 9
    

    由此可见,通过x[7] 等价于x.__getitem__(7),即定义了__getitem__方法就能使该元素变为可迭代对象,可以通过下标进行访问。

    不仅如此,一般来说只要是可迭代对象,均有x.__getitem__(y) <==> x[y],字典也不例外:

    dic = {
        'hjd': 'yyds',
        'zyy': 'goddess'
    }
    
    print(dic.__getitem__('hjd'))
    print(dic['hjd'])
    print(dic['hjd'] is dic.__getitem__('hjd'))
    
    

    结果:

    yyds
    yyds
    True
    
### 回答1: `__getitem__` 方法是 Python 类中的一个魔术方法,当使用类似于列表索引的方式访问类的实例时会触发这个方法。例如: ``` class MyClass: def __getitem__(self, index): # 此处可以实现类似列表的索引功能 obj = MyClass() print(obj[0]) ``` 在上面的代码中,当我们调用 `obj[0]` 时,会触发 `MyClass` 类的 `__getitem__` 方法。 ### 回答2: 在Python中,class是用于创建对象的蓝图或模板。__getitem__是class中的一个特殊方法,用于定义对象的索引操作行为。 当我们在使用类创建对象时,可以通过类似于列表或字典的方式对对象进行索引操作。这时,如果我们在class中定义了__getitem__方法,Python会自动调用这个方法来处理索引操作。 __getitem__方法接受一个参数,即索引值。我们可以在方法中根据传入的索引值来返回对象中特定索引位置的元素或属性。通常情况下,我们会在自定义的class中通过__getitem__方法实现类似于列表的索引操作,使对象能够像列表一样被索引和访问其中的元素。 例如,假设我们有一个自定义的类MyList,其中包含一个属性list_data用于存储一组数据。如果我们想要通过索引来访问这些数据,可以在MyList类中定义__getitem__方法。该方法可以接受一个参数index,然后返回list_data中相应索引位置的元素。 示例代码如下: ``` class MyList: def __init__(self, data): self.list_data = data def __getitem__(self, index): return self.list_data[index] my_list = MyList([1, 2, 3, 4, 5]) print(my_list[0]) # 输出1 print(my_list[3]) # 输出4 ``` 通过定义__getitem__方法,我们使得MyList类的对象可以像列表一样使用索引操作,可以通过中括号将对象中的元素取出来。从而使得Python的class更加灵活和可扩展,能够满足不同需求。 ### 回答3: 在Python的class中,__getitem__是一个特殊的方法,用于实现索引操作。当我们在一个对象上使用类似于obj[index]的索引操作时,实际上会调用该对象的__getitem__方法。 __getitem__方法接受一个参数index,它表示要获取的元素的索引位置。我们可以在这个方法中自定义对索引操作的处理逻辑,并返回对应位置的元素。 通过在class中定义__getitem__方法,我们可以让我们自己创建的对象能够支持索引操作,类似于列表或字典的使用方式。这样,我们就可以像操作列表一样,通过索引来访问这个对象内部的元素。 以下是一个示例: ```python class MyList: def __init__(self): self.data = [1, 2, 3, 4, 5] def __getitem__(self, index): return self.data[index] my_list = MyList() print(my_list[0]) # 输出:1 print(my_list[3]) # 输出:4 ``` 在上述示例中,我们创建了一个名为MyList的类,并在类中定义了__getitem__方法。该方法接受一个索引参数index,并返回指定位置的元素。 通过实例化这个类创建一个对象my_list后,我们可以使用索引操作来访问该对象中的元素。通过调用my_list[0],我们可以获取存储在data属性中索引为0的元素,即1。同样的道理,my_list[3]将返回4。 总而言之,__getitem__方法是Python中的一个魔法方法,用于在自定义类中实现索引操作,并返回指定位置的元素。它允许我们将自己定义的对象像列表或字典一样进行索引访问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值