0.Python中双下划线__有特殊意义。
1.构造函数和析构函数:
class Test: def __init__(self): #构造函数,创造实例默认执行 pass def __del__(self): #析构函数,程序全部运行完执行 pass
2.类的序列和映射协议,让类的实例可以实现类似序列的操作。
class Test: # 构造函数,创造实例默认执行 def __init__(self): self.date={} #这个方法通常要设置字典为数据类型 print("Default start") # 析构函数,程序全部运行完执行 def __del__(self): print("Default end") # 让实例可直接设置:A[key]=... def __setitem__(self, key, value): self.date[key]=value # 让实例可直接访问:A[item] def __getitem__(self, item): return self.date[item] # 让实例可直接运行del A[key] def __delitem__(self, key): del self.date[key] # 让实例可直接运行len(A) def __len__(self): return len(self.date) A=Test() #默认运行实例中的__setitem__ A["k1"]="abc" A["k2"]="ABC" #默认运行实例中的__getitem__ print(A["k1"],A["k2"]) #abc ABC print(A.date) #{‘k1‘: ‘abc‘, ‘k2‘: ‘ABC‘} #默认运行实例中的__len__ print(len(A)) #2 #默认运行__delitem__ del A["k1"] print(A.date) #{‘k2‘: ‘ABC‘}
3.类中函数property,通过设置property能够实现类中某些函数.
class C: def __init__(self): self._x = 123 def getx(self): return self._x def setx(self, value): self._x = value def delx(self): del self._x x = property(getx, setx, delx, "I‘m the ‘x‘ property.") c=C() print(c.x) #c.x will invoke the getter c.x=456 #c.x = value will invoke the setter del c.x #del c.x the deleter
4.迭代器,一层层访问数据,不同于列表要把全部数据加载到内存
it=iter(range(10)) #iter()函数获得一个迭代器 print("first",it.__next__()) print("second",it.__next__()) print("third",it.__next__()) print(next(it)) print(next(it))
class TestIterator: def __init__(self): self.value=0 def __next__(self): #必须要有__iter__方法才可以实现迭代 self.value+=1 if self.value>10: raise StopIteration return self.value def __iter__(self): #__iter__方法让类成为迭代器,包含__next__方法 return self #可以不用设置其他参数 TI=TestIterator() print(list(TI))
5.生成器,包含yield语句的函数都被称为生成器
- 生成器不是使用return返回一个值,而是可以生产多个值,每次一个。每次使用yield生成一个值后,函数都将冻结,等待下次调用。
- 应用如下:
datelist=[[1,2,3],[4,5],[6]] def generator(date): for i in date: for j in i: yield j #generator(datelist)生成器是以迭代的形式推进数据,而不是数据全部处理好一个一个调用。大数据时能省内存 for ii in generator(datelist): print(ii, generator(datelist))
原文地址:https://www.cnblogs.com/i201102053/p/10626354.html
时间: 2024-10-07 14:56:31