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)
day27-python之迭代器协议的更多相关文章
- python学习------迭代器协议和生成器
一.递归和迭代 递归:自己调用自己 举例解释:问路 A问B康明网络科技怎么走,B说我不是很清楚,我帮你问问C,C说我也不知道.我问问D,D说 就在兴隆.之后D返回结果给C,C返回结果给B,B返回结 ...
- 第十六篇 Python之迭代器与生成器
一.迭代器 一. 递归和迭代 生活实例说明什么是递归和迭代 A想去腾达大厦,问B怎么走路,B 说我不知道,我给你问问C,C也不知道,C又去问D,D知道,把路告诉了C,C又告诉B,B最后告诉A, 这就是 ...
- python 迭代器协议和生成器
一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stoplteration异常,以终止迭代(只能往后走,不能往前退) 2.可迭代 ...
- Python之路(第十篇)迭代器协议、for循环机制、三元运算、列表解析式、生成器
一.迭代器协议 a迭代的含义 迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 b为何要有迭代器? 对于序列类型:字符串.列表 ...
- python基础之迭代器协议和生成器
迭代器和生成器补充:http://www.cnblogs.com/luchuangao/p/6847081.html 一 递归和迭代 略 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个ne ...
- Python之路迭代器协议、for循环机制、三元运算、列表解析式、生成器
Python之路迭代器协议.for循环机制.三元运算.列表解析式.生成器 一.迭代器协议 a迭代的含义 迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的 ...
- Python之面向对象slots与迭代器协议
Python之面向对象slots与迭代器协议 slots: # class People: # x=1 # def __init__(self,name): # self.name=name # de ...
- python基础之迭代器协议和生成器(一)
一 递归和迭代 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...
- python面向对象的多态-类相关内置函数-类内置魔法函数-迭代器协议-上下文管理-04
多态 一种事物具备不同的形态 例如:水 --> 固态.液态.气态 多态:# 多个不同对象可以相应同一个对象,产生不同的结果 首先强调,多态不是一种特殊的语法,而是一种状态,特性(多个不同对象可以 ...
- (转)python基础之迭代器协议和生成器(一)
一 递归和迭代 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...
随机推荐
- 城东C位之路!探秘三线楼市板块崛起3大核心基因
等着咧!伍家篇什么时候出?这就出. 城东C位之路!- 诸葛磊 好几个粉丝已经在催了,诸葛磊决定改变下写作策略,伍家岗篇分版块用小篇幅来写,这样文章不至于太长,否则又是一篇洋洋洒洒上万字的文章,粉丝看着 ...
- vs2015编译OBS-Studio21.1.12
原文地址:http://www.freesion.com/article/37445100/ 参考:https://blog.csdn.net/su_vast/article/details/7498 ...
- TCP的拥塞窗口和快速恢复机制的一些备忘及一点想法
rwnd(窗口,代表接收端的处理能力).cwnd(拥塞窗口,从发送端看当前网络整体承载能力).ssthresh(快速增长切换成慢速增长的界限值) 1.慢启动,是指数增长(对面确认多少个包,就增加多少) ...
- 《电子计算机机房设计规范》GB50174-93
<电子计算机机房设计规范>GB50174-2008 http://gf.1190119.com/article-17886.htm 中华人民共和国国家标准 电子计算机机房设计规范 GB 5 ...
- c#修改webservice 的地址和端口(修改配置文件)
修改服务引用的地址和端口有两种方法: 1.直接修改配置文件web.config 2.动态修改: 右击转到实现 发现五个构造方法,通过第三个构造方法即可进行URL的初始化 IIS修改IP地址后 直接在初 ...
- Flutter UI系统
我们可以看到,无论是Android SDK还是iOS的UIKit 的职责都是相同的,它们只是语言载体和底层的系统不同而已.那么可不可以实现这么一个UI系统:可以使用同一种编程语言开发,然后针对不同操作 ...
- LeetCode_447. Number of Boomerangs
447. Number of Boomerangs Easy Given n points in the plane that are all pairwise distinct, a "b ...
- Pytest单元测试框架-Pytest环境安装
unittest是python自带的单元测试框架,它封装好了一些校验返回的结果方法和一些用例执行前的初始化操作,使得单元测试易于开展,因为它的易用性,很多同学也拿它来做功能测试和接口测试,只需简单开发 ...
- nginx+consul-template+consul实现自动负载均衡
所需工具:工具 下载地址 本文使用版本consul https://www.consul.io/downloads.html consul_1.0.7_linux_amd64.zipconsul-te ...
- 【VS开发】MFC CListCtrl列表控件的消息响应
MFC里的CListCtrl选中一行,消息是哪个.实在想不起来了.找了一篇文章,比较有用: http://www.cnblogs.com/hongfei/archive/2012/12/25/2832 ...