zoukankan      html  css  js  c++  java
  • day27-python之迭代器协议

    1.item系列方法

    # class Foo:
    #     def __getitem__(self, item):
    #         print('getitem',item)
    #         return self.__dict__[item]
    #
    #     def __setitem__(self, key, value):
    #         print('setitem')
    #         self.__dict__[key]=value
    #
    #     def __delitem__(self, key):
    #         print('delitem')
    #         self.__dict__.pop(key)
    #
    class Foo:
        def  __getitem__(self, item):
            print('getitem',item)
            return self.__dict__[item]
    
        def __setitem__(self, key, value):
            print('setitem')
            self.__dict__[key] = value
    
        def __delitem__(self, key):
            print('delitem')
            self.__dict__.pop(key)
    
    f1 = Foo()
    print(f1.__dict__)
    f1.name = 'egon'
    # f1['name'] = 'egon'
    f1['age'] = 18
    # print(f1.__dict__)
    
    
    # del f1.name
    # print(f1.age)
    
    # del f1['name']
    # print(f1.__dict__)
    print(f1['age'])
    raise  StopAsyncIteration
    # f1=Foo()
    # print(f1.__dict__)
    # # f1.name='egon'  #---->setattr-------->f1.__dict__['name']='egon'
    # f1['name']='egon'#--->setitem--------->f1.__dict__['name']='egon'
    # f1['age']=18
    #
    # print('===>',f1.__dict__)
    #
    # # del f1.name
    # # print(f1.__dict__)
    # #
    # # print(f1.age)
    # del f1['name']
    # print(f1.__dict__)
    #
    # print(f1['age'])
    # raise S

    2.slots属性

    class Foo:
        __slots__ = ['name','age']
    
    f1 = Foo()
    f1.name = 'egon'
    print(f1.name)
    
    
    # class Foo:
    #     __slots__=['name','age']  #{'name':None,'age':None}
        # __slots__='name' #{'name':None,'age':None}
    
    # f1=Foo()
    # f1.name='egon'
    # print(f1.name)
    
    # f1.age=18  #--->setattr----->f1.__dict__['age']=18
    
    
    f1.age = 18
    # print(f1.__dict__)
    print(Foo.__slots__)
    print(f1.__slots__)
    
    f1.name = 'egon'
    f1.age = 17
    print(f1.name)
    print(f1.age)
    # print(f1.__dict__)
    # print(Foo.__slots__)
    # print(f1.__slots__)
    # f1.name='egon'
    # f1.age=17
    # print(f1.name)
    # print(f1.age)
    # f1.gender='male'
    
    
    # f1.gender = 'male'
    
    f2 = Foo()
    print(f2.__slots__)
    f2.name = 'alex'
    f2.age = 18
    print(f2.name)
    print(f2.age)
    
    # f2=Foo()
    # print(f2.__slots__)
    # f2.name='alex'
    # f2.age=18
    # print(f2.name)
    # print(f2.age)

    3.内置方法

    class Foo:
        x = 1
        def __init__(self,y):
            self.y = y
    
        def __getattr__(self, item):
            print('------> from getattr:你找的属性不存在')
    
        def __setattr__(self, key, value):
            print('-----> from setattr')
            self.__dict__[key] = value
    
        def __delattr__(self, item):
            print('-----> from delattr')
            self.__dict__.pop(item)
    
    
    f1 = Foo(10)
    
    # class Foo:
    #     x=1
    #     def __init__(self,y):
    #         self.y=y
    #
    #     def __getattr__(self, item):
    #         print('----> from getattr:你找的属性不存在')
    #
    #
    #     def __setattr__(self, key, value):
    #         print('----> from setattr')
    #         # self.key=value #这就无限递归了,你好好想想
    #         # self.__dict__[key]=value #应该使用它
    #
    #     def __delattr__(self, item):
    #         print('----> from delattr')
    #         # del self.item #无限递归了
    #         self.__dict__.pop(item)
    #
    #
    # f1=Foo(10)
    # f1.x

    4.描述符

    # class Foo:
    #     def __get__(self, instance, owner):
    #         print('===>get方法')
    #     def __set__(self, instance, value):
    #         print('===>set方法',instance,value)
    #         instance.__dict__['x']=value #b1.__dict__
    #     def __delete__(self, instance):
    #         print('===>delete方法')
    
    
    class Foo:
        def __get__(self, instance, owner):
            print('===>get方法')
    
        def __set__(self, instance, value):
            print('===>set方法',instance,value)
            instance.__dict__['x'] = value
        def __delete__(self, instance):
            print('===>delete方法')
    class Bar:
        x = Foo()
        def __init__(self,n):
            self.x = n
    b1 = Bar(10)
    print(b1.__dict__)
    b1.x = 11111111111
    print(b1.__dict__)
    
    # class Bar:
    #     x=Foo() #在何地?
    #     def __init__(self,n):
    #         self.x=n #b1.x=10
    # b1=Bar(10)
    # print(b1.__dict__)
    # b1.x=11111111111111111
    # print(b1.__dict__)
    #
    b1.y = 111111111111111111111111
    print(b1.__dict__)
    print(Bar.__dict__)
    
    # b1.y=11111111111111111111111111111111111111
    # print(b1.__dict__)
    # print(Bar.__dict__)
    
    b1 = Bar()
    b1.x = 1
    # del  b1.x
    print(b1.x)
    #在何时?
    # b1=Bar()
    # b1.x
    #
    # b1.x=1
    #
    # del b1.x
    
    # print(b1.x)
    #
    # b1.x=1
    # print(b1.__dict__)
    #
    # del b1.x

    5.描述符优先级

    # class Foo:
    #     def  __get__(self, instance, owner):
    #         print('===>get方法')
    #
    #     def __set__(self, instance, value):
    #         print('===>set方法',instance,value)
    #
    #     def __delete__(self, instance):
    #         print('===>delete方法')
    
    
    
    # class Foo:
    #     def __get__(self, instance, owner):
    #         print('===>get方法')
    #     def __set__(self, instance, value):
    #         print('===>set方法',instance,value)
    #         # instance.__dict__['x']=value #b1.__dict__
    #     def __delete__(self, instance):
    #         print('===>delete方法')
    #
    #
    
    
    
    # class Bar:
    #     x=Foo() #在何地?
    
    # print(Bar.x)
    
    
    # Bar.x=1
    # print(Bar.__dict__)
    # print(Bar.x)
    
    
    
    
    # print(Bar.__dict__)
    # b1=Bar()
    # b1.x   #get
    # b1.x=1 # set
    # del b1.x # delete
    
    
    
    
    # b1=Bar()
    # Bar.x=111111111111111111111111111111111111111
    # b1.x
    #
    # del Bar.x
    # b1.x
    
    class Foo:
        def __get__(self, instance, owner):
            print('===>get方法')
    
        def __delete__(self, instance):
            print('===>delete方法')
    
    
    
    class Bar:
        x = Foo()
        def __getattr__(self, item):
            print('-------->')
    
    b1 = Bar()
    # b1.x = 1
    print(b1.__dict__)
    # class Foo:
    #     def __get__(self, instance, owner):
    #         print('===>get方法')
    #
    #
    #     # def __delete__(self, instance):
    #     #     print('===>delete方法')
    #
    #
    # class Bar:
    #     x=Foo() #在何地?
    #     def  __getattr__(self, item):
    #         print('----->')
    #
    # b1=Bar()
    # b1.x=1
    # print(b1.__dict__)
    # b1.xxxxxxxxxxxxxxxxxxxxxxx

    6.改变对象的字符串显示

    # l=list('hello')
    #
    # print(l)
    # file=open('test.txt','w')
    # print(file)
    
    
    
    # class Foo:
    #     def __init__(self,name,age):
    #         self.name=name
    #         self.age=age
    #     def __str__(self):
    #         return '名字是%s 年龄是%s' %(self.name,self.age)
    #
    # f1=Foo('egon',18)
    # print(f1) #str(f1)--->f1.__str__()
    #
    # x=str(f1)
    # print(x)
    #
    # y=f1.__str__()
    # print(y)
    
    class Foo:
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def __str__(self):
            return  '折是str'
    
        def __repr__(self):
            return  '名字是%s 年龄是%s' %(self.name,self.age)
    
    f1 = Foo('as',12)
    f1.__repr__()
    
    # class Foo:
    #     def __init__(self,name,age):
    #         self.name=name
    #         self.age=age
    #     # def __str__(self):
    #     #     return '折是str'
    #     def __repr__(self):
    #         return '名字是%s 年龄是%s' %(self.name,self.age)
    #
    # f1=Foo('egon',19)
    # #repr(f1)---->f1.__repr__()
    # print(f1) #str(f1)---》f1.__str__()------>f1.__repr__()

    7.析构方法

    # class Foo:
    #     def __init__(self,name):
    #         self.name=name
    #     def __del__(self):
    #         print('我执行啦')
    #
    # f1=Foo('alex')
    #
    # # del f1    #删除实例会触发__del__
    # del f1.name #删除实例的属性不会触发__del__
    # print('--------------------->')
    #
    # #程序运行完毕会自动回收内存,触发__del__
    
    class Foo:
        def __init__(self,name):
            self.name = name
    
        def __del__(self):
            print('我执行啦')
    
    f1 = Foo('andy')
    # del f1.name

    8.自定义格式化方法format

    # x='{0}{0}{0}'.format('dog')
    #
    # print(x)
    
    
    # class Date:
    #     def __init__(self,year,mon,day):
    #         self.year=year
    #         self.mon=mon
    #         self.day=day
    # d1=Date(2016,12,26)
    #
    # x='{0.year}{0.mon}{0.day}'.format(d1)
    # y='{0.year}:{0.mon}:{0.day}'.format(d1)
    # z='{0.mon}-{0.day}-{0.year}'.format(d1)
    # print(x)
    # print(y)
    # print(z)
    
    # x='{0.year}{0.mon}{0.day}'.format(d1)
    # y='{0.year}:{0.mon}:{0.day}'
    # z='{0.mon}-{0.day}-{0.year}'
    
    # format_dic={
    #     'ymd':'{0.year}{0.mon}{0.day}',
    #     'm-d-y':'{0.mon}-{0.day}-{0.year}',
    #     'y:m:d':'{0.year}:{0.mon}:{0.day}'
    # }
    format_dic = {
        'ymd':'{0.year}{0.mon}{0.day}',
        'm-d-y':'{0.mon}-{0.day}-{0.year}',
        'y:m:d':'{0.year}:{0.mon}:{0.day}'
    }
    class Date:
        def  __init__(self,year,mon,day):
            self.year = year
            self.mon = mon
            self.day = day
    
        def __format__(self, format_spec):
            print('我执行啦')
            print('--->',format_spec)
            if not format_spec or format_spec not in format_dic:
                format_spec = 'ymd'
            fm = format_dic[format_spec]
            return  fm.format(self)
    
    d1 = Date(2016,12,13)
    print(format(d1,'ymd'))
    print(format(d1,'y:m:d'))
    print(format(d1,'m-d-y'))
    print(format(d1,'m-d:y'))
    # class Date:
    #     def __init__(self,year,mon,day):
    #         self.year=year
    #         self.mon=mon
    #         self.day=day
    #     def __format__(self, format_spec):
    #         print('我执行啦')
    #         print('--->',format_spec)
    #         if not format_spec or format_spec not in format_dic:
    #             format_spec='ymd'
    #         fm=format_dic[format_spec]
    #         return fm.format(self)
    # d1=Date(2016,12,26)
    # # format(d1) #d1.__format__()
    # # print(format(d1))
    # print(format(d1,'ymd'))
    # print(format(d1,'y:m:d'))
    # print(format(d1,'m-d-y'))
    # print(format(d1,'m-d:y'))
    # print('===========>',format(d1,'asdfasdfsadfasdfasdfasdfasdfasdfasdfasdfasdfasdfasd'))
    
    print('=============>',format(d1,'assddd'))

    9.迭代器协议

    # class Foo:
    #     def __init__(self,n):
    #         self.n=n
    #     def __iter__(self):
    #         return self
    #
    #     def __next__(self):
    #         if self.n == 13:
    #             raise StopIteration('终止了')
    #         self.n+=1
    #         return self.n
    
    class Foo:
        def __init__(self,n):
            self.n = n
        def __iter__(self):
            return  self
    
        def __next__(self):
            if self.n == 13:
                raise StopIteration('终止了')
    
            self.n+=1
            return self.n
    f1 = Foo(10)
    print(f1.__next__())
    print(f1.__next__())
    
    # l=list('hello')
    # for i in l:
    #     print(i)
    # f1=Foo(10)
    # # print(f1.__next__())
    # # print(f1.__next__())
    # # print(f1.__next__())
    # # print(f1.__next__())
    #
    # for i in f1:  # obj=iter(f1)------------>f1.__iter__()
    #      print(i)  #obj.__next_()
    
    for i in f1:
        print(i)

    10.迭代器协议实现斐波那契数列

    # class Fib:
    #     def __init__(self):
    #         self._a=1
    #         self._b=1
    #
    #     def __iter__(self):
    #         return self
    #     def __next__(self):
    #         if self._a > 100:
    #             raise StopIteration('终止了')
    #         self._a,self._b=self._b,self._a + self._b
    #         return self._a
    class Fib:
        def __init__(self):
            self._a = 1
            self._b = 1
    
        def __iter__(self):
            return  self
    
        def __next__(self):
            if self._a > 100:
                raise  StopIteration('终止了')
    
            self._a,self._b=self._b,self._a+self._b
            return self._a
    
    f1 = Fib()
    
    print(next(f1))
    print(next(f1))
    print(next(f1))
    print(next(f1))
    print(next(f1))
    print(next(f1))
    # f1=Fib()
    # print(next(f1))
    # print(next(f1))
    # print(next(f1))
    # print(next(f1))
    # print(next(f1))
    # print('==================================')
    # for i in f1:
    #     print(i)
    
     
  • 相关阅读:
    Windows下Git使用记录03 Git GUI与金山快盘组建私人代码仓库进行项目开发
    windows下GIT使用记录00准备阶段
    setnx分布式锁原理
    Redis 中 bgsave 方式持久化的细节问题
    IOS开发(十一):场景(3)模态切换示例
    Android:TextView属性大全
    Android:ActionBar官方指导+个人整理
    IOS开发(十二):UIDatePicker
    IOS开发(十三):UIDatePicker、场景切换综合示例
    IOS开发(十):场景(2)模态切换示例
  • 原文地址:https://www.cnblogs.com/sqy-yyr/p/11371660.html
Copyright © 2011-2022 走看看