1. 什么是魔法方法:
直观的来看,魔法方法就是python中形如__init__(self):这样,以双下划线开始和结束的方法。魔法方法会在某种特定的情况下自动被调用执行,它往往规定了一些python的基本操作的响应行为,比如加法对应的魔法方法__add__(a,b),会在两个数相加的时候被调用,我们也可以重写这个方法实现定制自己的响应规则,魔法方法的重写给编程带来极大的灵活性
2. 构造函数和析构函数:
__init__(self):在创建对象的时候此方法自动调用,相当于java的构造器,可以自定义
__del__(self):垃圾回收使用,此函数的触发条件是指向一块内存的指针为0【对一个变量的引用为0】,而不是简单地使用del语句删除某个东西,就触发这个函数
3.几个重要的魔术方法的介绍
__str__:a是一个对象实例,print(a)的时候,就会调用这个方法,此方法必须返回一个string
__repr__:a是一个对象实例,直接a的时候,调用此方法
__getattr__:通过类访问属性的时候不会调用这个方法
__getattribute__:通过a对象访问某个属性值的时候,会被调用,如果不存在抛出异常,就会再调用__getattr__方法
__setattr__:设置a对象的属性的时候调用
__delattr__:删除a对象属性的时候调用
更多的魔术方法:点击打开链接
4.描述符【descriptor】
<1>. 什么是描述符:
直观的看,一个描述符必须实现这三个方法中的一个或者多个:__set__,__get__,__delete__,描述符是将某种特殊类型的类的实例(也就是实现了前面方法的类)赋值给另一个类作为这个类的属性,可以逆向理解,也就是在一个类里面,有一些特殊属性,你可以为这个属性单独写一个类,在这个类里面重写三个方法,从而自己定义这个属性在赋值,获取,以及删除的时候的应该执行怎样的业务逻辑
<2>这三个方法介绍:
__set__(self,instance,value):给描述符对应的属性赋值的时候自动被调用,instance是描述符所在类的实例对象,value是要赋的值
__get__(self,instance,owner):获取描述符对应的属性的值的时候自动被调用,instance是描述符所在的类owner的实例对象。
__delete__(self,instance):删除,同上
举例
class C:
def __get__(self,instance,owner):
return self.value
def __set__(self,instance,value):
self.value = float(value)
class F:
def __set__(self,instance,value):
instance.c = (value-32)/1.8 #对华氏度f赋值的时候,进行摄氏度转换,通过c的__set__函数设置摄氏度的值
def __get__(self,instance,owner):
return instance.c*1.8+32 #获取华氏度的时候,也是通过摄氏度来转换的,两者的转换围绕着摄氏度进行
class Temp:
c = C()
f = F()
#运行代码,创建Temp类对象,就可以分别对c和f两个属性进行赋值
5.迭代器
<1>什么是迭代器
直观来看,迭代器必然实现了魔法方法__iter__(),迭代器是可以被迭代访问的容器【提供了迭代方法的容器】
<原理>
两个内置的BIF,iter(iterObj)函数会返回一个可迭代对象a,参数是一个迭代器,next(a)方法会依次返回可迭代对象a的item【这个有点像java里面的tokenizer】,循环调用next()方法就可以迭代访问iterOb的每一个元素。
<深层>
深层看还是上面这两个BIF对应的魔法方法__iter__()和__next__,后者会返回迭代器自身,重点在前者,这个方法被重写就可以自己定义迭代规则,所以,完全可以自己定义一个迭代器,通过重写这两个方法,在__next__方法里面根据需要写自己的业务逻辑,实现具有定制的迭代操作额迭代器