栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python笔记,面向对象(11)遍历操作与描述器

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python笔记,面向对象(11)遍历操作与描述器

遍历操作与描述器
  • 遍历操作
    • 怎样让自己创建的对象可以使用for in进行遍历?
    • 怎样让自己创建的对象可以使用next函数进行访问?
    • 迭代器的复用
  • 描述器
    • 概念
    • 定义
      • 定义方式一:property
      • 定义方式二:
    • 调用细节

遍历操作 怎样让自己创建的对象可以使用for in进行遍历?

实现_ _ getitem _ _方法

class Person:
    def __init__(self):
        self.result = 1

    def __getitem__(self, item):
        self.result += 1
        if self.result >= 6:
            raise StopIteration("停止遍历")  #raise抛出异常, StopIteration停止遍历
        return self.result
    pass

p = Person()

for i in p:
    print(i)
    
    
2
3
4
5
    

实现_ _ iter _ _方法
_ _ lter _ _方法的优先级比 _ _ getitem _ _ 方法的优先级要高

class Person:
    def __init__(self):
        self.result = 1
    def __iter__(self):
        print("iter")
        return iter([1,2,3,4,5,6])   #遍历的就是方法里面的迭代器对象
    pass

p = Person()

for i in p:
    print(i)
怎样让自己创建的对象可以使用next函数进行访问?
class Person:
    def __init__(self):
        self.result = 1

    def __iter__(self):
        print("iter")
        return self

    def __next__(self):
        self.result += 1
        if self.result >= 6:
            raise StopIteration("停止遍历")
        return self.result
    pass

p = Person()

for i in p:
    print(i)

#lter()通过调用__ iter__ 返回一个迭代对象
#内部执行机制,当我们使用forin去访问遍历一个对象的时候,
#首先会使用iterator这个函数针对这个p对象计算出它里面的一个迭代器,
#而这个迭代器获取方法本质就是调用这个对象的方法来获取,
#拿到这个迭代器之后,使用next函数来针对迭代器来获取下一个数据,
#知道获取完毕,抛出异常为止。
迭代器的复用
class Person:
    def __init__(self):
        self.age = 1

    def __iter__(self):   #迭代器必须实现iter和next方法
        return self

    def __next__(self):
        self.age += 1
        if self.age >= 6:
            raise  StopIteration("STOP")

        return self.age

p = Person()
for i in p:
    print(i)


import collections    #判断p是不是迭代器
print(isinstance(p, collections.Iterator))


#迭代器一定可以通过next函数进行访问,但是能通过next函数的不一定是迭代器


可迭代对象->实现__iter__方法即可;迭代器->同时实现__iter__和__next__方法

描述器 概念

可以描述一个属性的对象,把多种描述的方法封装到一个对象中,这个对象就是一个描述器,一般而言,描述器是一个包含了描述器协议中的方法的属性值。 这些方法有 [__get__()]get), [__set__()]set) 和 [__delete__()]object.delete)。 如果为某个属性定义了这些方法中的任意一个,它就可以被称为 [descriptor]

  • 对象
  • 属性的操作:增,改,删,查
  • 描述
定义 定义方式一:property
class Person:
    def __init__(self):
        self.__age = 10

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, value):
        if value < 0:
            value = 0
        self.__age = value
    
    @age.deleter
    def age(self):
        del self.__age

    # age = property(age, set_age, del_age)

p = Person()
print(p.age)

定义方式二:
class Age:
    def __get__(self, instance, owner):
        print("get")

    def __set__(self, instance, value):
        print("set")

    def __delete__(self, instance):
        print("del")

class Person:
    age = Age()


p = Person()
p.age = 18
print(p.age)
del p.age
调用细节
  • 定义一个描述器,一般通过实例来进行操纵描述器,不通过类

  • 不能顺利转化的场景:

    ​ 新式类可以,经典类不可以

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1026639.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号