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

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

然而,当调用 x = SomeClass() 时候, __init__ 并不是第一个被调用方法。实际,还有一个叫做__new__ 方法,两个共同构成了“构造函数”。...__iter__(self) 返回一个容器迭代器,很多情况下返回迭代器,尤其是当内置iter()方法调用时候,以及当使用for x in container:方式循环时候。...它们反应了关于面向对象程序一些重要东西Python,并且总的来说Python: 总是一个简单方法去找某些事情, 即使是没有必要....这些魔法方法可能看起来不是很有用, 但是一旦你需要它们,你感到庆幸它们存在。 可调用对象 你也许已经知道,Python中,方法是最高级对象。...copy.copy()返回了你对象一个浅拷贝——这意味着,当实例本身是一个新实例时,它所有数据都被引用了——例如,当一个对象本身被复制了,它数据仍然是被引用(因此,对于浅拷贝中数据更改仍然可能导致数据原始对象改变

91370

Python魔术方法-Magic Method

然而,当调用 x = SomeClass() 时候, __init__ 并不是第一个被调用方法。实际,还有一个叫做__new__ 方法,两个共同构成了“构造函数”。...__iter__(self): 返回一个容器迭代器,很多情况下返回迭代器,尤其是当内置iter()方法调用时候,以及当使用for x in container:方式循环时候。...它们反应了关于面向对象程序一些重要东西Python,并且总的来说Python: 总是一个简单方法去找某些事情, 即使是没有必要....这些魔法方法可能看起来不是很有用, 但是一旦你需要它们,你感到庆幸它们存在。 可调用对象 你也许已经知道,Python中,方法是最高级对象。...copy.copy()返回了你对象一个浅拷贝——这意味着,当实例本身是一个新实例时,它所有数据都被引用了——例如,当一个对象本身被复制了,它数据仍然是被引用(因此,对于浅拷贝中数据更改仍然可能导致数据原始对象改变

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

流畅 Python 第二版(GPT 重译)(九)

明确一点:可迭代对象具有一个 __iter__ 方法,每次实例化一个新迭代器。迭代器实现了一个返回单个项 __next__ 方法,以及一个返回 self __iter__ 方法。...现在 Example 17-5 中迭代器实际是一个生成器对象,调用 __iter__ 方法时会自动构建,因为这里 __iter__ 是一个生成器函数。 紧随其后是对生成器全面解释。...示例 17-14 要点是:实现生成器时,要了解标准库中提供了什么,否则很可能重复造轮子。这就是为什么下一节涵盖了几个可直接使用生成器函数。...任何关于递归好教程都会强调有一个基本情况以避免无限递归重要性。基本情况是一个有条件返回而不进行递归调用条件分支。基本情况通常使用 if 语句实现。...④ 尝试已关闭协程使用 .send() 引发 StopIteration。 除了 .send() 方法,PEP 342—通过增强生成器实现协程 还介绍了一种协程返回值方法

16610

python 魔术方法(一) 自定义容器类与类属性控制

魔术方法 面向对象编程中,我们介绍了 __init__ 方法,这是由解释器默认实现,构造对象是自动调用特殊方法,类似的,Python 提供了一系列左右两边被一对双下划线包着方法,这些方法被称为“...特殊方法是 Python 解释器自动调用,因此你无需自己处理,但是,需要注意是,这些特殊方法是如此强大,同时也存在着很多陷阱,使用中必须处处小心谨慎。 3. 自定义容器类 3.1....len() 方法调用时,Python 自动调用对象 __len__ 方法。...for x in containers 等方式循环中,解释器自动调用 __iter__ 方法获取迭代器进行迭代。...,其实是无需实现 __getattribute__ 方法,事实,去主动实现 __getattribute__ 方法也是不建议,因为这太容易造成无限递归

57420

【Python 第75课】可迭代对象和迭代器

有了迭代器概念之后,如果一个对象定义了 __iter__方法,返回一个迭代器对象,那么它就是一个可迭代对象。 从表现上来说,一个对象可迭代,那么它就可以被 for 循环使用。...(事实,Iterator 就是 Iterable 子类) 迭代器 __iter__ 方法返回是自身,并不产生新实例。而可迭代对象 __iter__ 方法通常会生成一个新迭代器对象。...所以关于上述两点,我们可以有以下例子来验证: ? 迭代器和可迭代之间继承关系。 ? __iter__ 方法返回值区别。id 相同代表是同一个实例。...明白了上述概念之后,for 循环实现就好理解了: 首先 for 循环会调用可迭代对象 __iter__ 方法,获取相应迭代器 每次循环,将迭代器 __next__ 方法返回值赋值给循环变量...这样可以节省很多空间,尤其对于数量很大集合来说。 如果你不懂迭代器概念,并不影响代码中使用 for 循环。但了解之后,你会对代码理解得更透彻,同时这也是为我们后面要讲到生成器做铺垫。

64720

python中迭代器生成器到底有啥区别,看这篇就懂了

我们可以基于这个协议去定义自己方法类去达到自己目的,Python提供了两个魔法方法,分别是__iter__和__next__。...Python中可迭代对象(Iterable)并不是指某种具体数据类型,它是指存储了元素一个容器对象,且容器中元素可以通过__iter__( )方法或__getitem__( )方法访问。...__iter__方法作用是让对象可以用for … in循环遍历,getitem( )方法是让对象可以通过“实例名[index]”方式访问实例元素。...python解释器会用一个叫做 PyEval_EvalFramEx(c函数)去执行函数, 首先会创建一个栈帧(stack frame),所有的栈帧都是分配在堆内存,这就决定了栈帧可以独立于调用者存在。...当一个函数又调用子函数,又会创建一个栈帧。 python一切皆对象,函数执行时会生成两个对象栈帧对象, 字节码对象。 函数执行过程如图 注意:和静态语言函数执行过程不一样,静态语言是创建一个栈。

39210

Python快速学习第七天

为什么会有这样结果?调用一个实例方法时,该方法self参数会被自动绑定到实例(这称为绑定方法)。前面已经给出几个类似的例子了。但是如果直接调用方法(比如Bird....比如,程序读取一个特性时(尤其是实例中访问该特性,但该特性类中定义时),如果该特性被绑定到了实现了__get__方法对象,那么就会调用__get__方法(结果值也会被返回),而不只是简单地返回对象...__iter__方法会返回一个迭代器(iterator),所谓迭代器就是具有next方法(这个方法调用时不需要任何参数)对象。调用next方法时,迭代器返回它下一个值。...很多情况下,__iter__放到其他会在for循环中使用对象中。这样一来,程序就能返回所需迭代器。...没有生成器的话,算法就需要一个作为额外参数传递半成品方案,这样递归调用就可以在这个方案建立起来。如果使用生成器,那么所有的递归调用只要创建自己yield部分。

2.2K50

Python基础之:Python中

如果你想在实例时候做一些自定义操作,那么可以类中定义一个 __init__() 方法时,类实例化操作自动为新创建实例发起调用 __init__()。...我们示例中,调用 x.f() 其实就相当于 MyClass.f(x)。总之,调用一个具有 n 个参数方法就相当于调用再多一个参数对应函数,这个参数值为方法所属实例对象,位置在其他参数之前。...类变量和实例变量使用中,我们需要注意哪些问题呢?...如果基类本身也派生自其他某个类,则此规则将被递归地应用。 派生类可能重写其基类方法。...因为方法调用同一对象其他方法时没有特殊权限,所以调用同一基类中定义另一方法基类方法最终可能会调用覆盖它派生类方法

71620

Python基础之:Python中

如果你想在实例时候做一些自定义操作,那么可以类中定义一个 __init__() 方法时,类实例化操作自动为新创建实例发起调用 __init__()。...我们示例中,调用 x.f() 其实就相当于 MyClass.f(x)。 总之,调用一个具有 n 个参数方法就相当于调用再多一个参数对应函数,这个参数值为方法所属实例对象,位置在其他参数之前。...类变量和实例变量使用中,我们需要注意哪些问题呢?...如果基类本身也派生自其他某个类,则此规则将被递归地应用。 派生类可能重写其基类方法。...因为方法调用同一对象其他方法时没有特殊权限,所以调用同一基类中定义另一方法基类方法最终可能会调用覆盖它派生类方法

77220

Python 迭代器、生成器和列表解析

迭代器对象即实现了迭代器协议对象, Python 中,支持迭代器协议就是实现对象 __iter__() 和 next() 方法(注: Python3 中被改为 next 方法)。...其中 __iter__() 方法返回迭代器对象本身;next() 方法返回容器下一个元素,结尾时引发 StopIteration 异常。...自定义迭代器 自己创建迭代器实际就是实现一个带有 __iter__() 方法和 next() 方法类,用该类创建实例即是可迭代对象。...(flatten([[[1], 2], 3, 4, [5, [6, 7]], 8])) 这里需要注意是,不应该在 flatten 函数中对类似于字符串对象进行迭代,这样导致无穷递归,因为一个字符串第一个元素是另一个长度为...使用 send() 方法只有在生成器挂起之后才有意义,如果真想对刚刚启动生成器使用 send 方法,则可以将 None 作为参数进行调用

64720

Python进阶 | 五分钟带你弄懂迭代器与生成器,夯实代码能力

对于获取数据方法而言,我们一种就足够了。但是我后来Python使用以及TensorFlow等学习使用当中,我发现很多地方都用到了迭代器和生成器,或者是直接使用,或者是借鉴了思路。...显然这样消耗大量空间,有没有办法我们和迭代器那样构建一个生成数据方法,我们每次调用获取下一个结果呢?这样我们要多少数据就调用多少次就可以了,从根本上解决了存储问题。...括号创建法 最简单方法真的很简单,和我们创建list基本一模一样。...不同地方是,当我们下一次再次执行时候,继续从上次yield处开始往下执行。有些类似于递归时候,底层递归执行结束回到上层情况。因此如果我们要获取多个值,需要在生成器当中使用循环。...再来看iterate方法内部,我们通过yield from调用了iterate,所以我们执行时候,它会自动继续解析node.lchilditerate,也就是说我们通过yield from实现了递归

1.2K30

Python进阶——如何正确使用魔法方法?(下)

在上一篇文章Python进阶——如何正确使用魔法方法?()中,我们主要介绍了关于构造与初始化、类表示、访问控制这几类魔法方法,以及它们使用场景。...我们开发中多少都使用到过这些方法介绍容器魔法方法之前,我们首先想一下,Python 中容器类型都有哪些?...__iter__ 这个方法我们需要重点关注,为什么我们可以执行 [i for i in my_list]?就是因为我们定义了 __iter__。... Python3 中,已不再使用 next 方法,取而代之是 __next__。...容器类魔法方法,可以帮我们实现一个自定义容器类,然后我们就可以像操作 list、dict 那样,方便地去获取容器里元素、迭代数据等等。可调用对象魔法方法,可以把一个实例当做方法调用

70021

Python基础之:Python中

如果你想在实例时候做一些自定义操作,那么可以类中定义一个 __init__() 方法时,类实例化操作自动为新创建实例发起调用 __init__()。...我们示例中,调用 x.f() 其实就相当于 MyClass.f(x)。 总之,调用一个具有 n 个参数方法就相当于调用再多一个参数对应函数,这个参数值为方法所属实例对象,位置在其他参数之前。...类变量和实例变量使用中,我们需要注意哪些问题呢?...如果基类本身也派生自其他某个类,则此规则将被递归地应用。 派生类可能重写其基类方法。...因为方法调用同一对象其他方法时没有特殊权限,所以调用同一基类中定义另一方法基类方法最终可能会调用覆盖它派生类方法

72950

C++中反射调用.NET(三) 使用非泛型集合委托方法C++中列表对象list C++传递集合数据给.NET创建泛型List实例反射静态方法反射调用索引器当委托遇到协变和逆变C++CLI

.NET与C++之间传输集合数据 一篇《C++中反射调用.NET(二)》中,我们尝试了反射调用一个返回DTO对象.NET方法,今天来看看如何在.NET与C++之间传输集合数据。...创建泛型List实例 我们使用List来做集合对象,C#中,我们可以通过下面的方式得到List泛型类型,然后进一步创建泛型对象实例: Type t= typeof(List); 但是,对应C+...接口,所以 CreateGenericList 方法中将泛型List对象转换成IList接口对象,之后就可以愉快使用List对象了。... fun2; 这里,fun,fun2都可以绑定到方法,因为泛型方法形参作为返回值,是out,可以使用派生程度更小类型。...与.NET直接调用和反射性能比较 本篇方案中,都是C++反射来调用.NET方法,如果都是.NET应用程序中直接调用或者反射.NET方法,性能差距有多少呢?

9K100

一文解开可迭代对象和迭代器神秘面纱

只不过next()包装了__next__()方法,是一个全局函数,而__next__()是一个对象方法,只能由对象调用。...这样方法Python中还有许多,例如我们常用len()函数,就是这样设计原理,在对象内部有一个__len__()方法调用len(),内部实现就是__len__(). s = 'abcdefg...我们实际写代码中通常直接使用len()方法,因为这个调用起来更简单,可读性也更加好,这也是为什么Python要提供len()方法原因,毕竟Python设计是遵循优雅简洁原则进行。...我因为不小心执行了这个代码,导致内存使用率到达90%多,最后重启电脑才恢复。 最后 那为什么需要迭代器呢?...那是因为我们内存是有限,但可能需要表示数据是无限,那这个时候我们可以使用迭代器,Python3.x中,以前所有返回序列方法,都已经变为返回迭代器了。

60640

周末学习笔记——day02(带参装饰器,

def fn(a, b=10, *args, c, d=20, e, **kwargs): pass 2.函数嵌套调用 一个函数内部调用另一个函数:函数内部遇到调用其他函数...) 内置函数:匿名函数、常用内置函数 模块:模块,包,常用模块 ''' 三,带参装饰器 # 为什么要出现带参装饰器 def outer(func): # outer与inner之间要使用外部数据...__iter__() 来生成不依赖索引取值容器 # -- 结论:有__iter__()方法对象都称之为 可迭代对象 # 可迭代对象...._()且可以通过__next__()进行取值容器 # -- 注意:迭代器对象自身也拥有__iter__(), 通过该方法返回是迭代器对象自身 res = box....(enumerate(dic))) # => [(0, 'a'), (1, 'b')] 十一,递归 # 递归:函数直接或间接调用自己 # 回溯:找寻答案过程 # 递推:通过最终值反向一步步推出最初需要结果

36710

Python进阶——迭代器和可迭代对象有什么区别?

为什么这些「容器」可以使用 in 或 not in 来判断呢? 这是因为它们都实现了 __contains__ 方法。... Python 中,实现迭代器协议就是实现以下 2 个方法: __iter__:这个方法返回对象本身,即 self __next__:这个方法每次返回迭代值,没有可迭代元素时,抛出 StopIteration...然后执行 a = A(3),执行 for i in a 时,我们看到调用了 __iter__ 方法,然后依次输出 __next__ 中元素。...使用 yield 函数与使用 return 函数,执行时差别在于: 包含 return 方法会以 return 关键字为最终返回,每次执行都返回相同结果 包含 yield 方法一般用于迭代...,每次执行时遇到 yield 就返回 yield 后结果,但内部会保留上次执行状态,下次继续迭代时,继续执行 yield 之后代码,直到再次遇到 yield 后返回 当我们想得到一个集合时,如果使用普通方法

2.3K62

python 基础系列--可迭代对象、迭代器与生成器

for 循环开始时自动调用可迭代对象 __iter__ 方法获取一个迭代器,for 循环时自动调用迭代器 next 方法获取下一个元素,当调用可迭代器对象 next 方法引发 StopIteration...for,从第三个元素2开始输出 2 3 4 从结果可以看出,for 循环实际就是调用了迭代器 __next__方法,当捕捉到 MyListIterator 异常时自动结束 for 循环 创建一个可迭代对象...方法返回了迭代器类实例,因此它是一个可迭代对象。...遍历操作可使用 for 循环,无法使用 next()。for 循环实质还是调用 MyListIterator __next__ 方法。...不同是 return 返回后,函数释放,而生成器则不会。直接调用 next 方法或用 for 语句进行下一次迭代时,生成器从 yield 下一句开始执行,直至遇到下一个 yield。 (完)

59930

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

Python中有一些内建方法可以返回类表示,相对应,也有一系列魔法方法可以用来自定义使用这些内建函数时类行为。 __str__(self) 定义对类实例调用 str() 时行为。...__format__(self) 定义当类实例用于新式字符串格式化时行为,例如, "Hello, 0:abc!".format(a) 导致调用 a.format("abc") 。...和 _setattr__ 一样,使用它时也需要多加小心,防止产生无限递归 __delattr__ 实现中调用 del self.name 导致无限递归)。...__setattr__(),所以这里实现导致递归 # 这里调用实际是 self....协议类似某些语言中接口,里面包含是一些必须实现方法Python中,协议完全是非正式,也不需要显式声明,事实,它们更像是一种参考标准。 为什么我们要讲协议?

1.8K32

Python 基础:类与函数

1、Python 中类() 1.1 数据属性 类数据属性和实例数据属性 特殊类属性 属性隐藏 1.2 方法 实例方法方法 静态方法 1.3 访问控制 单下划线...“__new__”方法是新式类特有的方法,通常情况下,__new__方法会创建返回cls(cls指代当前类)实例,然后调用该类”__init__”方法作为初始化方法,该方法接收这个实例(即self)...继承时,传入是哪个实例,就是那个传入实例,而不是指定义了self实例 描述符类中,self指的是描述符类实例 总结: self定义时需要定义,但是调用时会自动传入...究竟为什么使用元类? 结语: 首先,你知道了类其实是能够创建出类实例对象。好吧,事实,类本身也是实例,当然,它们是元类实例。...type实际是它自己元类,纯Python环境中这可不是你能够做到,这是通过实现层面耍一些小手段做到。其次,元类是很复杂。对于非常简单类,你可能不希望通过使用元类来对类做修改。

90490
领券