十魔法方法特性和迭代器

Posted nuochengze

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十魔法方法特性和迭代器相关的知识,希望对你有一定的参考价值。

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

特性(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 : 用于停止生成器,调用时无需提供任何参数。

 

以上是关于十魔法方法特性和迭代器的主要内容,如果未能解决你的问题,请参考以下文章

九.魔法方法特性和迭代器

Python3 魔法方法:迭代器

python学习 魔法方法属性和迭代器

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

魔法方法

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