九.魔法方法特性和迭代器

Posted i201102053

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了九.魔法方法特性和迭代器相关的知识,希望对你有一定的参考价值。

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))

 

以上是关于九.魔法方法特性和迭代器的主要内容,如果未能解决你的问题,请参考以下文章

魔法方法特性和迭代器

Python3 魔法方法:迭代器

python学习 魔法方法属性和迭代器

课时48:魔法方法:迭代器

Python48--魔法方法:迭代器&生成器

魔法方法