刻意练习——Python基础Task11.特殊方法

mac2026-06-04  6

刻意练习——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允许为自定义类提供特殊方法,这样就可以让自定义类的对象也支持各种运算符的运算

最新回复(0)