多态 一种事物具备不同的形态 例如:水 --> 固态、液态、气态 多态:# 多个不同对象可以相应同一个对象,产生不同的结果 首先强调,多态不是一种特殊的语法,而是一种状态,特性(多个不同对象可以相应同一个方法...中常见的多态(不同的对象类型,拥有相同的方法,不同的结果) # 不管什么类型,他都与type这个方法 ---> python中多态的体现 # 多态在python中其实很常见,因为到处充斥着继承与组合...,用于优化对象内存 优化的原理:将原本不固定的属性数量,变得固定了,这样的解释器就不会以这个对象创建名称空间(所以__dict__也没了),从而达到减少内存开销的效果 另外当类中出现了__slots__...,我们可以自定义运算符来实现,让自定义对象也支持比较符 上述代码中.other指的是另一个参与比较的对象 大于和小于只要实现一个即可,符号如果不同解释器会自动交换两个对象的位置 迭代器协议 迭代器:是指具有...__iter__和__next__的对象 我们可以为对象增加这两个方法来让对象变成迭代器 class MyIter: # num 传入,用来指定迭代次数 def __init__(self
“__new__”方法是新式类特有的方法,通常情况下,__new__方法会创建返回cls(cls指代当前类)的实例,然后调用该类的”__init__”方法作为初始化方法,该方法接收这个实例(即self)...self的名字并不是规定死的,但是最好还是按照约定是用self self总是指调用时的类的实例。...究竟为什么要使用元类? 结语: 首先,你知道了类其实是能够创建出类实例的对象。好吧,事实上,类本身也是实例,当然,它们是元类的实例。...://python.jobbole.com/82300/ 8、Python 迭代器和生成器 8.1 迭代器 __iter__()和next()方法 自定义迭代器 迭代器和可迭代对象 8.2...像列表这种序列类型的对象,可迭代对象和迭代器对象是相互独立存在的,在迭代的过程中各个迭代器相互独立;但是,有的可迭代对象本身又是迭代器对象,那么迭代器就没法独立使用。
,使用nonlocal关键字; 21、递归 函数调用自身 设置了正确的返回条件 22、字典 字典不支持一键多值。...如果第一个参数不是对象,则永远返回False。 classinfo 可以是类对象组成的元祖,只要class与其中任何一个候选类的子类,则返回 True。...每一次对过程的重复被称为一次“迭代”,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。迭代器不是一个容器,是实现了next()方法的对象。...46、生成器、迭代器 生成器所能实现的任何操作都可以用迭代器来代替,因为生成器实际上就是基于迭代器实现的,生成器只是一个yield语句,内部自动创建iter()和next()方法。...generator 是用来产生一系列值的 yield 则像是 generator 函数的返回结果 yield 唯一所做的另一件事就是保存一个 generator 函数的状态 generator 就是一个特殊类型的迭代器
简单来说Python中的装饰器就是指某些函数或其他可调用对象,以函数或类作为可选输入参数,然后返回函数或类的形式。...▍生成器 Python生成器是创建迭代器的一种简单方法。上面提到的都由Python中的生成器自动处理的。 生成器是一个函数,它返回一个对象(迭代器),我们可以遍历该对象(每次一个值)。...不同之处在于,虽然return语句完全终止了一个函数,但是yield语句暂停保存函数的所有状态,然后在后续调用时继续执行。 ? 为什么在Python中使用生成器?...▍单继承 子类将具有基类的所有功能,还可以修改和增强。 子类初始化器希望调用基类初始化器,以使整个对象被初始化。 ?...调用其他类初始化器: 1、其他语言自动调用base class初始化器 2、Python像对待其他方法一样处理 _init__() 3、base class _init__()在被覆盖时不会被调用 4、
字典Dict Python内置了字典,使用key-value存储,具有极快的查找速度。和list相比,查找速度要高很多。 为什么dict查找速度这么快?因为dict的实现原理和查字典是一样的。...对于不可变对象作为函数参数,相当于C系语言的值传递; 对于可变对象作为函数参数,相当于C系语言的引用传递。 高级特性 迭代器 Python中的迭代器是什么呢?...迭代器中有两个基本的方法: next方法:返回迭代器的下一个元素 __iter__方法:返回迭代器对象本身。 生成器 带有yield的函数在Python中被称为生成器。...元类 类是用来描述如何生成一个对象的代码段,在Python中,类同样是一个对象,只要使用class关键字,Python解释器在执行的时候就会创建一个对象。...用Python的语言介绍就是,调用一个函数A,这个函数A返回了一个函数B给你,这个返回的函数B就叫做闭包。 装饰器就是一个闭包。
reversed() 和 sorted() 同样表示对列表 / 元组进行倒转和排序,reversed() 返回一个倒转后的迭代器;sorted() 返回排好序的新列表。...对于容器,你可以很直观地想象成多个元素在一起的单元;而不同容器的区别,正是在于内部数据结构的实现方法。 容器是可迭代对象,可迭代对象调用 iter() 函数,可以得到一个迭代器。...对于不可变对象(字符串、整型、元组等等),所有指向该对象的变量的值总是一样的,也不会改变。但是通过某些操作(+= 等等)更新不可变对象的值时,会返回一个新的对象。...__init__用来初始化,__new__用来生成一个实例。 成员函数:是正常的类的函数,第一个参数必须是self;可通过此函数来实现查询或修改类的属性等功能。...print(f'use time: {time.time() - beg}') return res return _log @LogTime() # 初始化装饰器类的实例
__bases__ 返回类的直接父类(实例没有该属性) class.__basicsize__ 类的字节数 obj.__sizeof__() 对象在内存中的字节数 class....__slots__() 只定义特定集合的某些属性,使用之后类变成静态一样,没有了__dict__, 实例也不可新添加属性 类相关魔法函数 目的 所编写代码 Python 实际调用 初始化一个实例...由于 bytes 类型的引入而从 Python 3 开始出现。 迭代器相关 目的 所编写代码 Python 实际调用 遍历某个序列 iter(seq) seq....__reversed__() 无论何时创建迭代器都将调用 __iter__() 方法。这是用初始值对迭代器进行初始化的绝佳之处。...许多数据类型都可以进行比较——字符串、列表,甚至字典。如果要创建自己的类,且对象之间的比较有意义,可以使用下面的特殊方法来实现比较。
{'i': 1234} 接下来是保留方法,可以把保留方法分类: 类的基础方法 序号 目的 所编写代码 Python 实际调用 ① 初始化一个实例 x = MyClass() x....由于 bytes 类型的引入而从 Python 3 开始出现。 行为方式与迭代器类似的类 序号 目的 所编写代码 Python 实际调用 ① 遍历某个序列 iter(seq) seq....__reversed__() 无论何时创建迭代器都将调用 __iter__() 方法。这是用初始值对迭代器进行初始化的绝佳之处。...无论何时从迭代器中获取下一个值都将调用 __next__() 方法。 __reversed__() 方法并不常用。它以一个现有序列为参数,并将该序列中所有元素从尾到头以逆序排列生成一个新的迭代器。...查阅 With 状态上下文环境管理器 了解更多细节。 真正神奇的东西 如果知道自己在干什么,你几乎可以完全控制类是如何比较的、属性如何定义,以及类的子类是何种类型。
enumerate() 函数将计数器变量附加到可迭代对象,并将其作为“枚举”对象返回。 我们可以直接在“for”循环中使用这个对象,或者通过调用 list() 方法将它转换成一个元组列表。...Python 中的 globals() 函数将当前全局符号表作为字典对象返回。 Python 维护一个符号表来保存有关程序的所有必要信息。此信息包括程序使用的变量、方法和类的名称。...但是,Python 有一种独特的方式来声明静态变量。 在类声明中使用值初始化的所有名称都成为类变量。那些在类方法中获得赋值的成为实例变量。...Python 中的生成器是一个返回可迭代对象的函数。我们可以使用yield 关键字迭代生成器对象。但是我们只能这样做一次,因为它们的值不会持久存在于内存中,它们会即时获取值。...它的工作原理类似于标准的 return 关键字。但它总是会返回一个生成器对象。此外,一个方法可以多次调用yield 关键字。 请参阅下面的示例。
在Python中创建一个迭代器 熟悉Python中的生成器 实现Python中的生成器表达式 为什么你应该使用迭代器? 什么是可迭代对象“可迭代对象是能够一次返回其一个成员的对象”。...像列表、元组、集合、字典、字符串等等之类的对象被称为可迭代对象。简而言之,任何你可以循环的对象都是可迭代对象。 我们可以使用for循环逐个地返回可迭代的元素。...迭代器跟踪可迭代对象的当前状态。 但可迭代对象和迭代器不同之处在于__next __()方法只能由迭代器访问。这使得无论何时只要我们要求迭代器返回下一个值,迭代器就会返回下一个值。...它用于分配程序执行期间类最初所需的任何值。我在这里设置num变量的初始值为2; iter()和next()方法使这个类变成了迭代器; iter()方法返回迭代器对象并对迭代进行初始化。...由于类对象本身是迭代器,因此它返回自身; next()方法从迭代器中返回当前值,并改变下一次调用的状态。我们将num变量的值加2,因为我们只打印偶数。
程序角度, 方法的工作方式与简单函数完全一致,只有一个重要差异:方法的第一个参数总是接受方法调用的隐形主体,也就是实例对象。 Python会自动把实例方法的调用对应到类方法函数。...从技术角度来将,迭代环境是通过调用内置函数iter去尝试寻找__iter__方法来实现的,而这种方法应该返回一个迭代器对象。...如果已经提供了,Python就会重复调用这个迭代器对象的next方法,直到发生StopIteration异常。...在较为复杂的的场景中,迭代器对象可定义为个别的类或对象,有自己的状态信息,对相同数据支持多种迭代。以Python raise语句发出信号表示迭代结束。...__iter__对象会在调用过程中明确地保留状态信息。所以比__getitem__具体更好的通用性。__iter__迭代器比__getitem__更复杂和难用。迭代器是用来迭代,不是随机的索引运算。
你必须记住改变程序中的两个地方 -- 第二次出现隐藏在循环的底部。 最好的方法是使用迭代器,这样能通过 for 语句来循环遍历对象。...CPython退出时为什么不释放所有内存? 当Python退出时,从全局命名空间或Python模块引用的对象并不总是被释放。...然后,你必须确保驻留在字典(或其他基于 hash 的结构)中的所有此类包装器对象的哈希值在对象位于字典(或其他结构)中时保持固定。...此函数从提供的可迭代列表中创建新列表,对其进行排序并返回。例如,下面是如何迭代遍历字典并按keys排序: for key in sorted(mydict): ......这是静态类型的要点 -- 编译器 总是 在编译时知道每个变量的作用域。 Python使用动态类型。事先不可能知道在运行时引用哪个属性。可以动态地在对象中添加或删除成员属性。
A8%A1%E5%9E%8B.ipynb 前言 数据模型其实是对 Python 框架的描述,它规范了这门语言自身构建模块的接口,这些模块包括但不限于序列、迭代器、函数、类和上下文管理器。...通常在不同框架下写程序,都需要花时间来实现那些会被框架调用的方法,python 当然也包含这些方法,当 python 解释器碰到特殊的句法的时候,会使用特殊方法来激活一些基本的对象操作,这种特殊方法,也叫做魔术方法...通过实现 python 的这些特殊方法,可以让自定义的对象实现和支持下面的操作: 迭代 集合类 属性访问 运算符重载 函数和方法的调用 对象的创建和销毁 字符串表示形式和格式化 管理上下文(也就是 with...python 内置的类型:比如列表(list)、字典(dict)等,那么 CPython 会抄近路,即 __len__ 实际上会直接返回 PyVarObject 里的 ob_size 属性。...小结 本文介绍了两个代码例子,说明了在自定义类的时候,实现特殊方法,可以实现和内置类型(比如列表、字典、字符串等)一样的操作,包括实现迭代、运算符重载、打印类实例对象等,然后还根据是否和运算符相关将特殊方法分为两类
•分代收集:Python把内存根据对象存活时间划分为三代,对象创建之后,垃圾回收器会分配它们所属的代。每个对象都会被分配一个代,而被分配更年轻的代是被优先处理的,因此越晚创建的对象越容易被回收。...2.简述面向对象中new和init区别? 1、__new__至少要有一个参数 cls,代表当前类,此参数在实例化时由Python解释器自动识别。...3、__init__有一个参数 self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值。...3.列出 Python 中可变数据类型和不可变数据类型,为什么?...•启动python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态。
你必须记住改变程序中的两个地方 -- 第二次出现隐藏在循环的底部。 最好的方法是使用迭代器,这样能通过 for 语句来循环遍历对象。...CPython 退出时为什么不释放所有内存? 当 Python 退出时,从全局命名空间或 Python 模块引用的对象并不总是被释放。...然后,你必须确保驻留在字典(或其他基于 hash 的结构)中的所有此类包装器对象的哈希值在对象位于字典(或其他结构)中时保持固定。...此函数从提供的可迭代列表中创建新列表,对其进行排序并返回。例如,下面是如何迭代遍历字典并按 keys 排序: for key in sorted(mydict): ......这是静态类型的要点 -- 编译器 总是 在编译时知道每个变量的作用域。 Python 使用动态类型。事先不可能知道在运行时引用哪个属性。可以动态地在对象中添加或删除成员属性。
1.4 内置函数 (1)fromkeys(iterable,value=None)创建并返回一个新的字典,第一个参数为可迭代对象(序列类型),第二个参数是value值。 ?...比如下面要介绍的类对象属性初始化的方法——构造方法,函数名为__init__,在函数对象实例化时调用,例: ?...9.7 迭代器 迭代器类似循环,每次的循环称为一次迭代,且本次迭代的结果将作为下次迭代的初始值。提供迭代器操作的容器成为迭代器,我们所熟知的序列类型和字典类型均属于迭代器。...迭代器的内置方法位__iter__(self)和__next__(self)。前者被触发返回迭代器对象,后者将初始值和后续值进行操作。...,并在需要的时候从程序离开的地方继续或者重新开始 生成器就是一类特殊的迭代器,作为一个迭代器,生成器必须要定义一些方法,其中一个就是__next__(),如同迭代器一样,我们可以使用next()函数来获取下一个值
领取专属 10元无门槛券
手把手带您无忧上云