十、魔法方法、特性和迭代器

魔法方法:开头和结尾都是两个下划线

特性(property)

迭代器(iterator)

1、构造函数

    构造函数,即初始化方法,只是命名为__init__。

    构造函数不同于普通方法的地方在于,将在对象创建后自动调用它们。

    在Python中,创建构造函数很容易,只需将方法init的名称从普通的init改为魔法版__init__即可。

    说明:在所有的Python魔法方法中,__init__是平常使用最多的。

    扩展:Python提供了魔法方法__del__,也称作析构函数(destructor),这个方法在对象被销毁(作为垃圾被收集)前被调用。

    

  1.1 重写普通方法和特殊的构造函数

    

    

    重写构造函数时,必须调用超类(继承的类)的构造函数,否则可能无法正确的初始化对象。

    有两种方法调用超类的构造函数:调用未关联的超类构造函数,以及使用函数super。

  1.2 调用未关联的超类构造函数

    

    对实例调用方式时,方法的参数self将自动关联到实例(称为关联的方法)

    通过类调用方法(如Brid.__init__),没有实例与其相关联,称为未关联的方法。

    通过将这个未关联方法的self参数设置为当前实例,即(如Brid.__init__(self)),达到使用超类的构造函数来初始化对象(如SongBrid)

  1.3 使用super

    

2、元素访问

  2.1 基本的序列和映射协议

    序列和映射基本上是元素(item)的集合,要实现它们的基本行为(协议),不可变对象需要实现两个方法,而可变对象需要实现4个。

    __len__(self):这个方法返回集合包含的项数,对序列来说为元素个数,对映射来说为键-值对数。如果__len__返回零,对象在布尔上下文中将被视为假。

    __getitem__(self,key):这个方法返回与指定键相关联的值。对序列来说,键应该是0-n-1的整数(可以为负数),其中n为序列的长度,对映射来说,键可以是任何类型。

    __setitem__(self,key,value):这个方法应以与键相关联的方式存储值,以便以后能够使用__getitem__来获取。当对象可变时,才需要实现这个方法。

    __delitem__(self,key):这个方法在对对象的组成部分使用__del__语句时被调用,应删除与key相关联的值。当对象可变时,且允许其项被删除)时,才需要实现这方法。  

    

  2.2 从list、dict和str派生

    

    

    CounterList类的行为在大多数方面都类似于列表,但它新增的counter属性,在当访问列表时,这个属性值都加1。

    在标准库中,模块collections提供了抽象和具体的基类,但是也可以继承内置内型(list、dict和str)       

3、特性

    通过存取方法定义的属性通常称为特性(proprety)。

  3.1 函数property

      

      通过调用函数property并将存取方法作为参数(获取方法在前,设置方法在后)创建了一个特性,然后将名称size关联到这个特性。

      调用函数property时,可不指定参数、指定一个参数、指定三个参数或指定四各参数。

      如果没有指定任何参数,创建的特性将即不可读也不可写。

      如果只指定一个参数(获取方法),创建的特性将是只读的。

      第三个参数是可选的,指定用于删除属性的方法(这个方法不接受任何参数)。

      第四个参数也是可选的,指定一个文档字符串。

      参数分别名为fget、fset、fdel和doc。

      说明:对于新式类,应使用特性而不是存取方法。

    

  3.2 静态方法和类方法

      静态方法和类方法创建:将它们分别包装在staticmethod和classmethod类的对象中。

      静态方法的定义中没有参数self,可直接通过类来调用。

      类方法的定义中包含类似于self的参数,通常被命名为cls,对于类方法,也可通过对象直接调用,但参数cls将自动关联到类。

      

      装饰器可用于包装任何可调用的对象,并且可用于方法和函数。

      可指定一个或多个装饰器,为此可在方法(或函数)前面使用运算符@列出这些装饰器(指定了多个装饰器时,应用的顺序与列出的顺序相反)。

      

     

  3.3 __getattr__、__setattr__等方法        

    可以拦截对对象属性的所有访问企图,其用途之一是在旧式类中实现特性。

    要在属性被访问时执行一段代码,必须使用一些魔法方法。

    __getattribute__(self,name):在属性被访问时自动调用(只适合与新式类)

    __getattr__(self,name):在属性被访问而对象没有这样的属性时自动调用

    __setattr__(self,name,value):试图给属性赋值时自动调用

    __delattr__(self,name):试图删除属性时自动调用

4、迭代器

  4.1 迭代器协议

      实现了方法__iter__的对象是可迭代的,而实现了方法__next__的对象是迭代器。

      

      通过对可迭代对象调用内置函数iter,可获得一个迭代器。

      

  4.2 从迭代器创建序列

      

5、生成器

  生成器是一种使用普通函数语法定义的迭代器。

  包含yield语句的函数都被称为生成器。

  生成器不使用return返回一个值,而是可以生成多个值。

  

  5.1 递归生成器

    

    在调用flatten时,有两种可能:基线条件递归条件

  5.2 通用生成器

    生成器由两个单独的部分组成:生成器的函数和生成器的迭代器。

    生成器的函数是由def语句定义的,其中包含yield。

    生成器的迭代器是这个函数返回的结果。

    

  5.3 生成器的方法

    send :外部世界可通过这个方法访问生成器。

    throw:用与在生成器中(yield表达式处)引发异常,调用时可提供一个异常类型、一个可选值和一个traceback对象。

    close : 用于停止生成器,调用时无需提供任何参数。

原文地址:https://www.cnblogs.com/nuochengze/p/12445944.html

时间: 2024-11-02 08:48:18

十、魔法方法、特性和迭代器的相关文章

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第09章 | 魔法方法、属性和迭代器

这一章,有点抽象,看着有点蛋疼! 双下划线__future__或单下划线有特殊含义,在Python中,这些名字的集合称为魔法方法:最重要的是__init__和一些处理访问对象的方法,这些方法允许你创建自己的序列或者是映射. ------ 准备工作: 将__metaclass__=type放在模块的最开始位置,以确保类时最新式的.考虑下面两个类 class NewStyle(object): more_code_here class OldStyle: more_code_here 如果文件以__

《Python基础教程(第二版)》学习笔记 -&gt; 第九章 魔法方法、属性和迭代器

准备工作 >>> class NewStyle(object): more_code_here >>> class OldStyle: more_code_here 在这两个类中,NewStyle是新式的类,OldStyle是旧式的类,如果文件以__metaclass__ = type 开始,那么两个类都是新式类. 构造方法 构造方法,当一个对象被创建后,会立即调用构造方法.Python中创建一个构造方法,只要把init方法的名字从简单的init修改成__init__

python基础教程_学习笔记11:魔法方法、属性和迭代器

魔法方法.属性和迭代器 在python中,有的名称会在前面和后面各加上两个下划线,这种写法很特别.它表示名字有特殊含义,所以绝不要在自己的程序中使用这种名字.在python中,由这些名字组成的集合所包含的方法叫做魔法(或称特殊)方法.如果对象实现了这些方法中的某一个,那么这个方法会在特殊的情况下被python调用,而几乎没有直接调用它们的必要. 准备工作 为了确保类是新型的,应该把赋值语句__metaclass__=type放在你的模块的最开始,或者(直接或间接)子类化内建类(实际上是类型)ob

python魔法方法、构造函数、序列与映射、迭代器、生成器

在Python中,所有以__双下划线包起来的方法,都统称为"魔术方法".比如我们接触最多的__init__,魔法方法也就是具有特殊功能的方法. 构造函数 构造函数不同于普通方法,将在对象创建后自动调用它们.也就是在对象创建完成后,自动会调用__init__方法来初始化. 创建一个构造方法 构造方法传参 >>> class FooBar: def __init__(self,value=42): #默认参数 self.somevar = value >>&g

《Python基础教程》 读书笔记 第九章 魔法方法、属性和迭代器(上)

构造方法 在Python中创建一个构造方法很容易.只要把init方法的名字从简单的init修改为魔法版本__init__即可: >>> class FooBar: ...     def __init__(self): ...         self.somevar=42 ... >>> f=FooBar() >>> f.somevar 42 给构造方法传几个参数 >>> class FooBar: ...     def __in

Python3 魔法方法:迭代器

0.什么是迭代器 迭代器不是容器,而是实现了__next__方法的对象(用于遍历容器中的数据) 在python原生支持的数据结构中set(集合)是仅支持迭代器访问的,不支持下标(index)访问 1.相关的BIF iter() 将一个可迭代对象转换成一个迭代器 next() 访问迭代器中的下一个变量,如果迭代器没有变量了,则返回StopIteration异常 2.魔法方法 __iter__(self) 返回迭代器本身 __next__(self) 决定迭代的方法 3.例题: 用while语句实现

课时48:魔法方法:迭代器

目录: 一.迭代器 二.课时48课后习题及答案 ************* 一.迭代器 ************* 迭代的意思类似于循环,每一次重复的过程被称为一次迭代的过程,而每一次迭代得到的结果会被用来作为下一次迭代的初始值.提供迭代方法的容器称为迭代器,通常接触的迭代器有序列(列表.元组.字符串)还有字典也是迭代器,都支持迭代的此操作. 举个例子,通常使用for语句来进行迭代: >>> for i in "FishC": print(i) F i s h C 字

python语法学习第十天--魔法方法

魔法方法二!!! 属性访问:在对属性任何操作时,都会调用   有关属性 __getattr__(self, name) 定义当用户试图获取一个不存在的属性时的行为 __getattribute__(self, name) 定义当该类的属性被访问时的行为 __setattr__(self, name, value) 定义当一个属性被设置时的行为 __delattr__(self, name) 定义当一个属性被删除时的行为 __dir__(self) 定义当 dir() 被调用时的行为 __get_