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

遍历操作

怎样让自己创建的对象可以使用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

调用细节

  • 定义一个描述器,一般通过实例来进行操纵描述器,不通过类

  • 不能顺利转化的场景:

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

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值