程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python魔法之__getitem__

編輯:Python

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. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved