python类中的和def __getitem__(self,id):

在类看到这个函数定义会感觉很奇怪,因为在实例中感觉好像没用这个定义函数。

但如果你也是python新手小白的话,就继续看下去。

class test(t.nn.Module):
    def __init__(self):
        super(test, self).__init__()
        self.id = id
    def __getitem__(self, key):
        return "hello"


data = test()
k=''
print(k)
print(data.__getitem__(k))
print(data[k])

#out
#hello
#hello

很明显在类中定义该函数当非self的形式参数只有一个的时候,data.__getitem__(k)和data[k]都是一样的

我用简单的例子说明了,只要将类实例化后,将实例当成列表形式输入下标(我输入的是空字符),不管你输入什么,只要在类中有定义def __getitem__(self,id):都会有默认的返回值。

当然你也给这个函数函数进行重载,增加形式参数,当只有一个非self的形式参数的时候才能调用只输入下标,来获取__getitem__()的返回值。

只有def __getitem__(self)无法调用data[id]

class test(t.nn.Module):
    def __init__(self):
        super(test, self).__init__()
        self.id = id
    def __getitem__(self):
        return "hello"

data = test()
k=''
print(k)
#print(data.__getitem__())
print(data[k])


Traceback (most recent call last):
  File "E:/PY charm file/yolo_test.py", line 24, in <module>
    print(data[k])
TypeError: __getitem__() takes 1 positional argument but 2 were given

def __getitem__(self,id,key)也无法调用data[id]

class test(t.nn.Module):
    def __init__(self):
        super(test, self).__init__()
        self.id = id
    def __getitem__(self,id,x):
        return "hello"


data = test()
k=''
print(k)
#print(data.__getitem__(k,1))
print(data[k,1])                    #自己看着就觉得不行,还要run吗,没必要哈哈哈



Python中,`__getitem__`是一个特殊方法,用于定义对象的索引和切片行为。当您尝试通过索引或切片访问对象时,Python将调用此方法。这通常在您正在处理如列表(list)、字典(dict)、字符串(str)等可迭代对象时使用。 当类继承自内置的序列类型(例如list、str、tuple等)并使用`__getitem__`方法时,可以在类的实例中实现更复杂的数据访问操作。 这是一个基本的示例,展示如何使用`__getitem__`方法来处理一个类继承自list的自定义列表: ```python class MyList(list): def __getitem__(self, index): # 可以在这里实现一些特定的索引逻辑 print("Getting item at index", index) return super().__getitem__(index) my_list = MyList([1, 2, 3, 4]) print(my_list) # 输出: "Getting item at index 1" # 输出: 2 ``` 在这个例子中,当我们通过索引访问`my_list`中的元素时,Python会首先调用`__getitem__`方法,然后才调用内置的`list.__getitem__`方法。这意味着我们可以在这个方法中实现一些特定的逻辑,比如打印出每次访问的索引,或者返回特殊的结果。 需要注意的是,`__getitem__`方法通常返回被索引的对象,而不是该对象本身。这是因为Python的索引操作通常期望返回的是原始对象,而不是对同一对象的引用。例如,当我们使用索引访问列表时,我们期望得到的是列表中的元素,而不是对列表的引用。 此外,如果你想要实现切片操作,你可以在`__getitem__`方法中处理这些情况。例如,你可以定义如何根据起始和结束索引来生成一个新的序列。例如: ```python class MyList(list): def __getitem__(self, index): if isinstance(index, slice): start, stop = index.start, index.stop return MyList(super().__getitem__(start, stop)) else: return super().__getitem__(index) ``` 在这个例子中,如果尝试使用切片操作访问列表,`__getitem__`方法将返回一个新的`MyList`实例,其中包含了原始列表的子集。这对于处理类似列表的数据结构非常有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

running鸿

感谢感谢各位,祝各位学习进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值