如果在类中定义了__getitem__()方法,那么他的实例对象(假设为P)就可以这样P[key]取值。当实例对象做P[key]运算时,就会调用类中的__getitem__()方法。...self.id:1, self.address:"192.168.1.1" } def __getitem...return "hello" data=DataTest(1,"192.168.2.11") print data[2] 输出结果为:hello 在这我认为实例对象的key...不管是否存在都会调用类中的__getitem__()方法。...而且返回值就是__getitem__()方法中规定的return值。
凡是在类中定义了这个__getitem__ 方法,那么它的实例对象(假定为p),可以像这样p[key] 取值,当实例对象做p[key] 运算时,会调用类中的方法__getitem__。...一般如果想使用索引访问元素时,就可以在类中定义这个方法(__getitem__(self, key) )。先用一个夸张一点的例子来说明这个问题。?...当实例对象通过[] 运算符取值时,会调用它的方法__getitem__,从上面代码中输出二个笑脸可以看出来。...''' def __init__(self, id, address): '''初始化方法''' self.id = id self.address =...address def __getitem__(self, key): return self.
(1)像__getitem__这种由两个双下划线构成的方法,被称为魔术方法。 (2)魔术方法是为了给python解释器用的。...__getitem__(key)方法。 (3)魔术方法是属于类的方法,也就是说不需要实例化类就可以访问到该方法,同时,实例化的对象都可以访问到该方法。...(4)使用__getitem__和__len__方法,我们就可以实现一个对自定义数据类型的迭代和访问。...自定义的FrenchDeck类在重写了__getitem__和__len__方法之后,就可以对FrenchDeck实例化的对象进行类似于列表的操作。...对合成的运用使得__len__和__getitem__的具体实现可以代理给self._card这个python列表。
在Python面向对象编程中,魔术方法是一组特殊的方法,用于在特定情况下调用对象的操作。其中,__len__和__getitem__方法是常用的魔术方法之一。...__getitem__方法用于获取序列对象中指定索引位置的元素,通常使用中括号[]运算符调用。该方法接收一个索引作为参数,并返回序列对象中指定索引位置的元素。...在__init__方法中,我们使用可变参数args初始化了MyList对象的data属性。接着,我们实现了__len__和__getitem__方法。...在__len__方法中,我们返回了MyList对象的长度。在__getitem__方法中,我们根据传入的索引值index,返回了MyList对象中指定索引位置的元素。...此外,在实现__getitem__方法时,还可以使用切片操作符[:]来获取序列对象的一部分元素。
切片是 Python 中最迷人最强大最 Amazing 的语言特性(几乎没有之一),在《Python进阶:切片的误区与高级用法》中,我介绍了切片的基础用法、高级用法以及一些使用误区。...1、魔术方法:__getitem__() 想要使自定义对象支持切片语法并不难,只需要在定义类的时候给它实现魔术方法 __getitem__() 即可。所以,这里就先介绍一下这个方法。...概括翻译一下:__getitem__() 方法用于返回参数 key 所对应的值,这个 key 可以是整型数值和切片对象,并且支持负数索引;如果 key 不是以上两种类型,就会抛 TypeError;如果索引越界...特别需要说明的是,此例中的 __getitem__() 方法会根据不同的参数类型而实现不同的功能(取索引位值或切片值),也会妥当地处理异常,所以并不需要我们再去写繁琐的处理逻辑。...4、小结 本文介绍了__getitem__()魔术方法,并用于实现自定义对象(以列表类型和字典类型为例)的切片功能,希望对你有所帮助。
所以,集合的物件取出元素的函数名字如下: 行18: __getitem__(self,...)...首先实现一个 update 函数 行39:注意,更新操作不需要返回新的对象,而是修改对象中的 data 重点来了, 索引赋值操作 同样有魔法方法: 行41:魔法方法名字: __setitem__(self...但不出意外的话,很快就会出意外! ---- 陷阱 许多初学者以为,索引赋值操作会执行2个步骤( 错误理解 ): 执行等号左边的筛选操作。...调用了魔法方法 __getitem__ ,得到了一个新的数据表 执行赋值操作 现在我们自己实现了一遍就清楚知道,实际上代码只调用了 __setitem__ 函数, 没有调用 __getitem__ ,因此不会产生任何新的对象...---- 警告机制 问题核心就在于: 既然是 __getitem__ 的祸,那就从这里做手脚吧。
图 | 《借东西的小人阿莉埃蒂》剧照 起步 python的提供一系列和属性访问有关的特殊方法:__get__, __getattr__, __getattribute__, __getitem__。...本文阐述它们的区别和用法。 属性的访问机制 一般情况下,属性访问的默认行为是从对象的字典中获取,并当获取不到时会沿着一定的查找链进行查找。例如 a.x 的查找链就是,从 a....一、__getattr__ 方法 这个方法是当对象的属性不存在是调用。如果通过正常的机制能找到对象属性的话,不会调用 __getattr__ 方法。...__get__(None, A) 其他情况见文末参考资料的文档 四、__getitem__ 方法 这个调用也属于无条件调用,这点与 __getattribute__ 一致。...总之,每个以 __get 为前缀的方法都是获取对象内部数据的钩子,名称不一样,用途也存在较大的差异,只有在实践中理解它们,才能真正掌握它们的用法。
检查对象是否实现了__getitem__()方法如果你正在操作的是一个自定义类的实例,你需要确保该类实现了__getitem__()方法来支持下标操作。...__getitem__()方法定义了下标操作返回的结果。...__getitem__()方法是Python中的一个特殊方法(也称为魔术方法或魔法方法),用于支持对象的下标操作符[]。...方法定义和用法__getitem__()方法定义在类中,并且接受一个参数,用于指定要访问的下标或键。根据下标或键的不同,__getitem__()方法可以有不同的实现。...总之,__getitem__()方法是一个用于支持下标操作的特殊方法,它允许我们使用下标访问对象的属性或元素。
最近用python写个东西,里面用到了一个zip,内存飙升,甚是费解,查阅资料后发现zip在python2和3中的机制不同 class Foo(object): def __init__(...('__getitem__', 0) ('__getitem__', 0) ('__getitem__', 1) ('__getitem__', 1) ('__getitem__', 2) ('__getitem...python2中是先把2个foo**全部遍历一下组成一个新的列表,十分耗内存** 而python3是返回一个迭代器,遍历zip(foo1, foo2)时才会去取foo1和foo2的每个元素,不费内存...---- (Python版本3.3有zip这个用法吗?...Color的回)[https://www.zhihu.com/question/22089964]
python中常见的内置类型 什么是魔法函数? python的魔法函数总被双下划线包围,它们可以给你的类增加特殊的方法。...如果你的对象实现了这些方法中的一个,那么这个方法就会在特殊情况下被调用,你可以定义想要 的行为,而这一切都是自动发生的。 魔法函数一览 魔法函数举例 1.1....] company = Company(['11','22','33']) #加了魔法函数“__getitem__”,类就成了可迭代的了 for em in company: print(em...) #11,22,33 如果不用魔法函数循环出每个员工的方法 class Company(object): def __init__(self,employee_list):...__repr__和__str__的用法
例如: >>> slice(0,2) slice(0, 2, None) __getitem__ 列表、元组等序列之所以可以索引取值、分片取值,是因为它们实现了__getitem__方法。...__") True >>> hasattr(str,"__getitem__") True 如果自定义类并实现__getitem__方法,它们会重载索引取值: class cls: def __getitem...分片和__getitem__ 如果想要__getitem__支持分片取值,需要在__getitem__中使用索引取值的方式,以便支持slice对象作为索引。...,如果想要删除索引值或分片值,会调用__delitem__()方法。...__的类是可迭代的类型,是通过数值索引的方式进行迭代的,但这是退而求其次的行为,更好的方式是定义__iter__方法,使用迭代协议进行迭代。
本博客讲解了pytorch框架下DataLoader的多种用法,每一种方法都展示了实例,虽然有一点复杂,但是小伙伴静下心看一定能看懂哦 :) 个人建议,在1.1.1节介绍的三种方法中,推荐 方法二>方法一...可编写独立的数据处理函数,在__getitem__函数中进行调用;或者直接将数据处理方法写在__getitem__函数中或者__init__函数中,但__getitem__必须根据index返回响应的值...,注意成员方法__getitem__和__len__都是未实现的。...例如cifar-10数据,我们只需要在__getitem__方法中,按index来读取对应位置的字节,然后转换为label和img,并返回。在__len__中返回cifar-10训练集的总样本数。...__和 __len__ 具体用法看参考第四条(搭配torch.utils.data.DataLoader) 2.1 ImageFolder 这个和DatasetFolder一样,适合用于已经下载好的并且符合一定要求的数据集
1、切片的基础用法 列表是 Python 中极为基础且重要的一种数据结构,也是最能发挥切片的用处的一种数据结构,所以在前两节,我将以列表为例介绍切片的一些常见用法。...(几乎没有之一),以上两小节虽然介绍了切片的基础用法与高级用法,但这些还不足以充分地展露切片的魅力,所以,在接下来的两章节中,我们将聚焦于它的更高级用法。...3.1、魔术方法:`getitem()` 想要使自定义对象支持切片语法并不难,只需要在定义类的时候给它实现魔术方法 __getitem__() 即可。所以,这里就先介绍一下这个方法。...概括翻译一下:__getitem__() 方法用于返回参数 key 所对应的值,这个 key 可以是整型数值和切片对象,并且支持负数索引;如果 key 不是以上两种类型,就会抛 TypeError;如果索引越界...5、小结 最后总结一下,切片是 Python 的一种高级特性,常用于截取序列类型的元素,但并不局限于此,本文主要介绍了它的基础用法、高级用法(如占位符用法)、自定义对象切片、以及迭代器切片等使用内容。
,__array__方法返回数组的对象,或任何(嵌套)序列。...指定阵列的内存布局。该参数我至今还没有遇到过具体用法,这句话的意思就是我不会,故在此省略。 ⑤ subok:可选参数,类型为bool值。...Python 类特殊方法__getitem__ 凡是在类中定义了这个__getitem__ 方法,那么它的实例对象(假定为p),可以像这样 p[key] 取值,当实例对象做p[key] 运算时,会调用类中的方法...__getitem__。...10. np.empty()函数 作用: 创建一个没有任何具体值的ndarray数组,是创建数组最快的方法。 根据给定的维度和数值类型返回一个新的数组,其元素不进行初始化。
从前面的对Python基础知识方法介绍中,我们几乎是围绕Python内置方法进行探索实践,比如字符串、列表、字典等数据结构的内置方法,和大量内置的标准库,诸如functools、time、threading...dir函数 Python中内置的dir函数用于提取某对象内所有属性的方法,,诸如对象的方法及属性 L = [1, 2, 3, 4] print(dir(L)) print([]) 示例结果: ['__add...,但我们仍然不知道这些属性方法的含义,那么我们可以利用文档字符串帮助我们继续学习对象属性。...我们也可以查看一些内置类型的某属性的具体使用方法,比如查看列表对象中pop的具体含义和用法 L = [1, 2, 3, 4] print(L.pop....__delslice__(i, j) del x[i:j] | -- More -- 比如我们可以通过help查看列表的所有详细信息和属性的用法等,通过回车键查看更多的信息。
让我们通过例子来说明表中的其他方法吧。 索引和分片:__getitem__ 和 __setitem__ 如果在类中定义了(或继承了)的话,则对于实例的索引运算,会自动调用__getitem__。...因此,__getitem__也可以是Python中一种重载迭代的方式。如果定义了这个方法,for循环每次循环时都会调用类的__getitem__,并持续搭配有更高的偏移值。...无论我们的应用程序是否需要这种通用性,用户定义的迭代器都是强大的工具,可让我们把任意对象的外观和用法变得很像书本所遇到过的其他序列和可迭代对象。...要支持更加特定的成员关系,类可能编写一个__contains__方法……当出现的时候,该方法优先于__iter__方法,__iter__方法优先于__getitem__方法。...这样可以让类实例的外观和用法类似于函数。
Dataset简介及用法 Dataset 本质上就是一个抽象类,可以把数据封装成 Python 可以识别的数据结构。...(1)自定义子类 必须要继承已经内置的抽象类 dataset 必须要重写其中的 init() 方法、 getitem() 方法和 len() 方法 其中 getitem() 方法实现通过给定的索引遍历数据样本..., len() 方法实现返回数据的条数 定义一个MyDataset类继承Dataset抽象类,其中pass为占位符,并且改写其中的三个方法 import torch from torch.utils.data...可独立编写的数据处理函数,在__getitem__()函数中进行调用;或者直接将数据处理方法写在__getitem__()函数中或者__init__()函数中,但__getitem__()函数必须根据index...子类TensorDataset data = TensorDataset(src, trg) DataLoader简介及用法 Dataset 和 DataLoader 是一起使用的,在模型训练的过程中不断为模型提供数据
原因是 defaultdict 在继承了内置类型 dict 之后,还定义了一个 __missing__() 方法,当 __getitem__取不存在的值时,它就会调用入参中传入的工厂函数(上例是调用 list...__missing__() 是魔术方法的“二等公民”,它没有独立的调用入口,只能被动地由 __getitem__() 调用,即__missing__() 依赖于__getitem__()。...__missing__() 依赖于__getitem__(),才能实现方法调用;而 __getitem__() 也要依赖 __missing__(),才能实现完整功能。...为了实现这一点,__getitem__()在解释器代码中开了个后门,从 C 语言界面折返回 Python 界面,去调用那个名为“__missing__”的特定方法。...4、小结 Python 的字典提供了两种取值的内置方法,即__getitem__() 和 get(),当取值不存在时,它们的处理策略是不一样的:前者会报错KeyError,而后者会返回 None。
实现了__iter__()的实例虽能用于for循环,看似像list,但并不能将其当做list来使用,比如,Fib()[5]还是报错 可通过实现__getitem__()方法,;来实现让实例像list...那样按照下标取出元素 实现按照下标取元素 class Fib(object): def __getitem__(self, n): a, b = 1,...__()传入的参数可能是一个int,也可能是一个切片对象slice,因此需要做判断 如果把对象看成dict,__getitem__()的参数也可能是一个可以作key的object,例如str...__()还是有很多工作要做的 __setitem__和__delitem__ 与之对应的还有__setitem__()方法和__delitem__()方法,分别用于为某个元素设值和删除某个元素... 总之,通过上面的方法,可自定义的类表现得和Python自带的list、tuple、dict没什么区别,这完全归功于动态语言的"鸭子类型",不需要强制继承某个接口
获取元素 — __getitem__ __getitem__(self, key) 对于容器来说,获取元素是最重要的操作,魔术方法 __getitem__就完成了这个工作,每当对对象通过[]操作符获取元素时...索引与切片 我们建立了一个纸牌类,有了 __getitem__ 方法,我们就定义了索引操作,所有 dict 通过 [] 可以做的事,我们的纸牌类都可以做到: >>> deck = FrenchDeck(...__missing__ __missing__(self, key) 如果你的类是一个继承自 dict 的字典类,并且你没有实现自己的 __getitem__ 方法,那么当默认的 __getitem__...但是,需要注意的是,如果你自己实现了 __getitem__ 方法,并且没有调用父类的 __getitem__ 方法,那 __missing__ 将永远都不会被调用。...这有两种方法可以解决: 显式调用 使用父类 __getitem__ 4. 控制类属性的访问 4.1.
领取专属 10元无门槛券
手把手带您无忧上云