首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

课时47:魔法方法:定制序列

本节来讲定制容器,那就必须先知道,定制容器有关的一些协议。 如果说你希望定制的容器是不可变的话,你只需要定义__len__()和__getitem__()方法。...__len__(self)        定义当被 len() 调用时的行为(返回容器中元素的个数) __getitem__(self, key)...定义当使用成员测试运算符(in 或 not in)时的行为 举个例子:编写一个不可改变的自定义列表,要求记录列表中每个元素被访问的次数。...= {}.fromkeys(range(len(self.values)), 0) #这里使用列表的下标作为字典的键,注意不能用元素作为字典的键 #因为列表的不同下标可能有值一样的元素...,但字典不能有两个相同的键 def __len__(self): return len(self.values) def __getitem__(self, key)

35630
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    PyTorch 小课堂开课啦!带你解析数据处理全流程(一)

    在简单捋一捋思路之后,就从 torch.utils.data 数据处理模块开始,一步步重新学习 PyTorch 的一些源码模块解析,希望也能让大家重新认识已经不陌生的 PyTorch 这个小伙伴。...和 DataLoader 这三个类中都会用到包括 __len__(self),__getitem__(self) 和 __iter__(self) 的抽象类的魔法方法。...· __len__(self):定义当被 len() 函数调用时的行为,一般返回迭代器中元素的个数。...· __getitem__(self):定义获取容器中指定元素时的行为,相当于 self[key] ,即允许类对象拥有索引操作。 · __iter__(self):定义当迭代容器中的元素时的行为。...我们通常接触的数据结构,如序列(列表、元组和字符串)还有字典等,都支持迭代操作,也可称为可迭代对象。 那什么是迭代器(Iterator)呢?

    1K10

    Python教程(23)——Python类中常用的特殊成员

    这些特殊成员在类的定义中具有特殊的语法和功能,用于实现对象的特定行为和操作。 特殊方法一般由Python解释器调用,无需手动调用。...通过在类中定义这些特殊方法,可以改变对象的默认行为,使其具备更多的功能和操作。特殊方法提供了一种更加Pythonic的面向对象编程的方式,可以让代码更加简洁和易读。...__len__ __len__ 用于定义对象的长度。它主要被用于内置函数 len() 的操作,用于返回一个对象的长度或元素的个数。...__len__ 方法的格式通常如下: def __len__(self): # 返回对象的长度或元素的个数 在 __len__ 方法中,self 代表对象本身。...在 __len__ 方法中,我们使用内置函数 len() 计算了 data 列表的长度,并返回该长度。

    14110

    pytorch源码分析之torch.utils.data.Dataset类和torch.utils.data.DataLoader类

    在torch.utils.data.Dataset和torch.utils.data.DataLoader这两个类中会用到python抽象类的魔法方法,包括__len__(self),__getitem...__(self)和__iter__(self) __len__(self) 定义当被len()函数调用时的行为(返回容器中元素的个数) __getitem__(self)定义获取容器中指定元素的行为,相当于...__iter__(self)定义当迭代容器中的元素的行为 下面通过介绍python定制容器的方式来介绍__len__(self),__getitem__(self)两种方法。....fromkeys(range(len(self.values)),0) # 这里使用列表的下标作为字典的键,注意不能用元素作为字典的键 # 因为列表的不同下标可能有值一样的元素,但字典不能有两个相同的键...,并且需要重写__len__和__getitem__。

    1K10

    Python - 面向对象编程 - 魔术方法(双下划线方法)

    什么是魔术方法 在Python中,所有以 __ 双下划线包起来的方法,都统称为 Magic Method 魔术方法,也叫双下划线方法 有哪些重要的魔术方法?...__len__ len() 调用对象会返回 __len__ 方法 return 的值,必须返回 integer class A: def __len__(self): return...__call__(a, b) __len__(self) 定义当被 len() 调用时的行为 __repr__(self) 定义当被 repr() 调用时的行为 __str__(self)...定义当描述符的值被改变时的行为 __delete__(self, instance) 定义当描述符的值被删除时的行为 比较操作符 __lt__(self, other) 定义小于号的行为...一般被用来处理异常,清除工作或者做一些代码块执行完毕之后的日常工作 容器类型 __len__(self) 定义当被 len() 调用时的行为(返回容器中元素的个数) __getitem__

    28930

    不知道鸭子类型就当没学过python

    魔法函数好处多多 魔法函数是python中的特殊方法,那你可以理解为,这些特殊方法是一些定义好的回调行为, 所以魔法函数不能自定义,定义之后不需要调用,若你将这些行为用到自己的类中,那么当触发这个回调后就会调用这个方法...__:在Python中,我们经常会使用len()函数获取一个对象的长度,实际上在其内部会自动调用该对象的__len__()方法 tips: python内置类型(int list dict)底层均为c语言写的..., 需要用cython解释器去执行,所以长度在一开始分配内存空间的时候就已经确定了,而不是去遍历,所以用魔法函数的len的效率高 栗子: class WordNums(): def __init__...(self, *args): self.word = args def __len__(self): print("调用了__len__方法") return len(self.word...__getitem__:在被迭代时会传入当前的循环变量然后进行索引 __setitem__:这个方法应该以与键相关联的方式(类似字典的方式)存储值,以便之后能够使用__setitem__来获取(也即key

    54120

    什么是魔术方法(magic methods)

    这些方法在类定义中被调用,用于实现特定的功能或行为。魔术方法也被称为特殊方法或双下方法。魔术方法在Python中起着非常重要的作用,它们可以帮助我们自定义类的行为,使其更具有灵活性和可扩展性。...通过实现魔术方法,我们可以改变类的实例化、属性访问、运算符重载等行为,从而实现自定义的逻辑。...当我们对一个对象使用内置的len函数时,会自动调用对象的__len__方法。...它们在类定义中被调用,用于实现特定的功能或行为。...通过实现这些魔术方法,我们可以自定义类的行为,使其更具有灵活性和可扩展性。魔术方法使得我们可以改变类的实例化、属性访问、运算符重载等行为,从而实现自定义的逻辑。

    40320

    Python入门之面向对象编程(三)Python类的魔术方法

    ,重新定义后则可以定制打印内容 __new__ 创建实例时自动调用 __del__ 对象在内存中被释放时触发(后面不设置例子) __len__ 定义 len(实例) 返回的内容,比如字符串类就定义的是字符串的字符个数...,当然也可以改成其他的 __eq__ 改变==运算符的行为,定义实例使用==number时,是拿实例的什么与number相比 和eq类似的还有ne lt le gt ge 还有一些用于实例之间数值计算的...__add__ __abs__等方法,定义方式和__eq__差不多,这些应用的典型类就是数值类,定义这些其实定义了某些运算符的行为,比如__iadd__定义了+=的行为一样。...__repr__ = __str__ # 这样简单赋值即可 def __len__(self): # 定义len函数返回的结果 return len(self.name...) 实现 __iter__ __next__ 方法 如果只实现__iter__则这个方法的返回值必须是一个迭代器 也可以__iter__返回一个self,再定义__next__方法,接受self为参数,

    74240

    Python 开发者不得不知的魔术方法(Magic Method)

    自定义容器的magic method 下面细致了解下定义容器可能用到的魔术方法。首先,实现不可变容器的话,你只能定义 __len__ 和 __getitem__ (下面会讲更多)。...__len__(self) 返回容器的长度。对于可变和不可变容器的协议,这都是其中的一部分。 __getitem__(self, key) 定义当某一项被访问时,使用self[key]所产生的行为。...= [] else: self.values = values def __len__(self): return len(self.values...反射 你也可以控制怎么使用内置在函数sisinstance()和issubclass()方法 反射定义魔术方法....当然也可以改变其它的对象。描述器并不是独立的。相反,它意味着被一个所有者类持有。当创建面向对象的数据库或者类,里面含有相互依赖的属相时,描述器将会非常有用。

    96270

    非常全的通俗易懂 Python 魔法方法指南

    2.1 比较操作符 Python包含了一系列的魔法方法,用于实现对象之间直接比较,而不需要采用方法调用。同样也可以重载Python默认的比较方法,改变它们的行为。...协议类似某些语言中的接口,里面包含的是一些必须实现的方法。在Python中,协议完全是非正式的,也不需要显式的声明,事实上,它们更像是一种参考标准。 为什么我们要讲协议?...因为在Python中实现自定义容器类型需要用到一些协议。首先,不可变容器类型有如下协议:想实现一个不可变容器,你需要定义 __len__ 和 __getitem__ (后面会具体说明)。...5.1 容器背后的魔法方法 __len__(self) 返回容器的长度,可变和不可变类型都需要实现。...: self.values = values def __len__(self): return len(self.values) def _

    1.9K32

    Sampler类与4种采样方式

    ))) def __len__(self): return len(self.data_source)顺序采样类并没有定义过多的方法,其中初始化方法仅仅需要一个Dataset类对象作为参数...前述几种方法都只需要self.data_source实现了__len__()方法,因为这几种方法都仅仅使用了len(self.data_source)函数。..._num_samples # 返回数据集长度 def __len__(self): return self.num_samples最重要的是__iter__()方法,定义了核心的索引生成行为...return len(self.indices)上述代码中__len__()的作用与前面几个类的相同,依旧是返回数据集的长度,区别在于__iter__()返回的并不是随机数序列,而是通过随机数序列作为indices...: # 在不进行剔除时,数据的长度就是采样器索引的长度 if self.drop_last: return len(self.sampler) // self.batch_size

    1K20
    领券