Python高级 04 - Python元类及迭代器生成器

内容

1. __getattr__和__getattribute__魔法函数

  • __getattr__是当类调用一个不存在的属性时才会调用getattr魔法函数,他传入的值item就是你这个调用的不存在的值。
    在这里插入图片描述
  • getattribute__则是无条件的优先执行,所以如果不是特殊情况最好不要用__getattribute

在这里插入图片描述

2. 属性描述符

  • 属性描述符介绍
    属性描述符是一个强大的通用协议。它是properties, methods, static methods, class methods 和super()的调用原理。

  • 属性描述符协议
    属性描述符是实现了特定协议的类,只要实现了__get__,__set__和__delete__三个方法中的任意一个,这个类就是描述符,它能实现对多个属性运用相同存取逻辑的一种方式,通俗来说就是:创建一个实例,作为另一个类的类属性。

  • 注意
    如果一个对象同时定义了__get__和__set__方法,它被称做数据描述符(data descriptor)。
    只定义__get__方法的对象则被称为非数据描述符(non-data descriptor)

  • 使用类方法创建描述符
    定义一个IntField类为描述符类
    创建IntField类的实例,作为另一个User类的属性
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 描述符查找顺序
    当为数据描述符时, get__优先级高于__dict
    当为非数据描述符时,dict__优先级高于__get

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 元类

  • 元类介绍
    元类实际上就是创建类的类

  • 实现如下:
    定义创建类的函数create_class
    如果给create_class传的参数为user,则创建User类

在这里插入图片描述

  • type()创建元类
    第一个参数:name表示类名称,字符串类型
    第二个参数:bases表示继承对象(父类),元组类型,单元素使用逗号
    第三个参数:attr表示属性,这里可以填写类属性、类方式、静态方法,采用字典格式,key为属性名,value为属性值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • metaclass属性
    如果一个类中定义了__metalass__ = xxx,Python就会用元类的方式来创建类,就可以控制类的创建行为

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. Python迭代器

迭代器指的是迭代取值的工具,迭代是指一个重复的过程,每一次重复都是基于上一次结果而来
迭代提供了一种通用的不依赖索引迭代取值方式

  • 可迭代对象
    可以用for循环遍历的对象都是可迭代对象。

    • str,list,tuple,dict,set等都是可迭代对象。
  • 判断是否可迭代
    除了看内置是否含有__iter__方法来判断该对象是否是一个可迭代的对象之外,我们还可以使用 isinstance() 判断一个对象是否是 Iterable 对象
    isinstance()–>用来判断对象是否是相应类型,与type()类似。
    在这里插入图片描述

  • 迭代器对象
    有内置的__next__()方法的对象,执行该方法可以不依赖索引取值
    有内置的__iter__()方法的对象,执行迭代器的__iter__()方法得到的依然是迭代器本身

在这里插入图片描述

  • iter()
    可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
    那我们可以通过iter()方法将可迭代的对象,转为迭代器。
    在这里插入图片描述
  • 注意:
    迭代器不可以通过下标取值,而是使用__next__()或者next()。但是只要超出范围则直接报错StopIteration。
    在这里插入图片描述
  • next()只能顺延调用,不能往前
    在这里插入图片描述
  • 可迭代对象与迭代器区别
    可用于for循环的都是可迭代类型
    作用于next()都是迭代器类型
    ist、dict、str等都是可迭代的但不是迭代器,因为next()函数无法调用它们。可以通过iter()函数将它们转为迭代器
    python的for循环本质就是通过不断调用next()函数实现的

5. 生成器函数

当一个函数中包含yield关键字,那么这个函数就不再是一个普通的函数,而是一个generator。调用函数就是创建了一个生成器对象。其工作原理就是通过**重复调用next()或者__next__()方法,**直到捕获一个异常

比如:
实现斐波那契数列,除第一个和第二个数外,任何一个数都可以由前两个相加得到:
1,1,2,3,5,8,12,21,34…

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 注意:
    yield返回一个值,并且记住这个返回值的位置,下次遇到next()调用时,代码从yield的下一条语句开始执行。与return的差别是,return也是返回一个值,但是直接结束函数

  • 迭代器与生成器
    生成器能做到迭代器能做的所有事
    而且因为生成器自动创建了iter()和next()方法,生成器显得简洁,而且高效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值