刻意练习——Python基础Task11.特殊方法
常见的特殊方法
- 重写__ repr__方法:“自我描述”方法,当程序员直接打印该对象时,系统将会输出该对象的“自我描述”信息,总是返回该对象实现类的“类名+object at+内存地址”值。要真正实现“自我描述”方法,必须重写__ repr__()方法。
class Apple:
#实现构造器
def __init__(self,color,weight):
self.color = color;
self.color = weight;
#重写__repr__()方法
def __repr__(self):
return"Apple[color="+ self.color +\
",weight=" + str(self.weight) + "]"
a = Apple("红色",5.68)
#打印Apple对象
print(a)
- 析构方法__ del__:用于销毁Python对象——在任何Python对象将要被系统回收之时,系统都会自动调用该对象的__ del__()方法
- __ dir__方法:用于列出该对象内部的所有属性(包括方法)名,该方法将会返回包含所有属性(方法)名的序列(列表)
- __ dict__属性:用于查看对象内部储存的所有属性名和属性值组成的字典,通常程序直接使用该属性即可
- __ getattribute__(self,name):当程序访问对象的name属性时被自动调用,并读取属性
- __ getattr__(self,name):当程序访问对象的name属性且该属性不存在时被自动调用,并读取属性
- __ setattr__(self,name,value):当程序对对象的name属性赋值时被自动调用,并设置属性
- __ delattr__(self,name):当程序删除对象的name属性时被自动调用,并删除属性
通过getattr、setattr、delattr来合成属性
如果程序需要在读取、设置属性之前进行某种拦截处理(比如检查数据是否合法之类的),也可通过重写__ settattr__()或__ getattribute__方法来实现
- hasattr(obj,name):检查obj对象是否包含名为name的属性或方法
- getattr(object,name[,default]):获取object对象中名为name的属性的属性值
- setattr(obj,name,value,/):将obj对象的name属性设为value
- __ call__属性:一个函数之所以能执行,关键在于__ call__()方法,通过判断属性(或方法)是否包含__ call__属性来确定它是否可调用,而x.(arg1,arg2,…)只是x.__ call__(arg1,arg2,…)的快捷写法
与序列相关的特殊方法
- __ len__(self):该方法的返回值决定序列中元素的个数
- __ getitem__(self,key):该方法获取指定索引对应的元素。该方法的key应该是整数值或slice对象,否则该方法会引发KeyError异常
- __ contains__(self,item):该方法判断序列是否包含指定元素
- __ setitem__(self,key,value):该方法设置指定索引对应的元素。该方法的key应该是整数值或slice对象,否则该方法会引发KeyError异常
- __ delitem__(self,key):该方法删除指定索引对应的元素
- __ iter__(self):该方法返回一个迭代器,迭起器必须包含一个__ next__()方法,该方法返回迭代器的下一个元素
- __ reversed__(self):该方法主要为内键的reversed()反转函数提供支持,当程序调用reversed()函数对指定迭代器执行反转时,实际上是由该方法实现的
- __ next__():该方法会返回数列的下一个值
- 生成器与迭代器功能非常相似,区别在于:迭代器通常是先定义一个迭代器类,然后通过创建实例来创建迭代器;而生成器则是先定义一个包含yield语句的函数,然后通过调用该函数来创建生成器
- 创建生成器:
1.定义一个包含yield语句的函数
2.调用第一步创建的函数得到生成器
#定义一个差值递增的数列生成器
def test(val,step):
print("------函数开始执行------")
cur = 0
#遍历0~val
for i in range(val):
#cur添加i*step
cur += i*step
yield cur
t = test(10,2)
print('============')
#获取生成器的第一个值
print(next(t)) #0,生成器被冻结在yield处
print(next(t)) #2,生成器被再次冻结在yield处
#下面是输出结果:
============
------函数开始执行------
0
2
-
yield cur语句的作用:
1.每次返回一个值,有点类似于return语句
2.冻结执行,程序每次执行到yield语句时就会被暂停;在程序被yield语句冻结之后,当程序再次调用next()函数获取生成器的下一个值时,程序才会继续向下执行 -
调用包含yield语句的函数并不会立即执行,它只是返回一个生成器。只有当程序通过next()函数调用生成器或遍历生成器时,函数才会真正执行
-
程序可使用for循环来遍历生成器,相当于不断地使用next()函数获取生成器的下一个值
-
send()方法:于next()函数的功能非常相似,在其基础上,send()方法可以接受一个参数,该参数值会被发送给生成器函数
-
外部程序通过send()方法发送数据,生成器函数使用yield语句接收收据
-
close()方法:用于停止生成器
-
throw()方法:用于在生成器内部(yield语句内)引发一个异常
-
Python允许为自定义类提供特殊方法,这样就可以让自定义类的对象也支持各种运算符的运算