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


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

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

  • 相关阅读:
    练习上传下载时遇到的问题
    el表达式遇到的问题
    js中for循环闭包问题记录
    随机排座位(模板) 20.10.17
    #STL:优先队列数据结构函数的用法 #堆 #优先队列数据结构(堆) #priority_queue 20.10.17
    关于int的范围
    #归并排序 归并排序的刷题记录 ~20.09.25
    #欧拉函数 ~20.8.27
    #排列 #组合 ~20.8.24
    105.七夕祭
  • 原文地址:https://www.cnblogs.com/nuochengze/p/12445944.html
Copyright © 2020-2023  润新知