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

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

发布了38 篇原创文章 · 获赞 1 · 访问量 814

猜你喜欢

转载自blog.csdn.net/weixin_45774706/article/details/102871323