上篇文章探討了
__call__
魔法方法,這裡探討__getitem__
的奇妙之處。
Python中的對象分為可迭代對象與不可迭代對象,那麼什麼是可迭代對象呢?
可以這樣簡單地說,可以使用for i in obj
進行遍歷的對象均為可迭代對象,不能用for i in obj
進行遍歷的就是不可迭代對象。
因此range(n)、list、tuple、str、dict
等均為可迭代對象,而int、float
與一般的函數對象、類對象
等是不可迭代對象。
可迭代對象之所以可迭代,就是因為內部實現了__iter__
或__getitem__
魔法方法
如果不定義__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
定義__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