【Python】笔记19(定制类)
回顾__slots__,用来限制class实例所能添加绑定的属性;.__len__用于调用该string类型的字符串长;__len__()能让class作用于len()函数。
__str__(self),将实例的属性返回成可视化的结果。如例子中,调用时,无__str__返回的是一个开发员代码;有__str__,并返回值的是一串字符串,用print调用的出来结果就是字符串。
直接调用变量则还是一个开发员代码,这是因为变量调用的是__repr__(),是调试服务的。解决办法是,再定义一个__repr__(),偷懒写法:在代码最后,__repr__=__str__
'实例本身是迭代对象
__iter__,该方法返回一个迭代对象,然后后面还需要有一个__next__()方法来取循环值,直到StopIteration错误出现。
(Fib()类里面只有数的计算,类里面没有for循环,for循环在外部,而n in Fib()是否表明,Fib()是一个数组?j继续往下看)
__getitem__,可以使类似list的类像list那样按照下标的方式取出元素。
但是却无法像list那样实现切片。这时,在类的定义中内,加上索引(int)、切片(slice)的类型判断;如果传入参数是索引,则循环就是for x in range(n);如果传入参数是切片,则循环就是for x in rnage(n.stop),(因为n是切片,n.stop就是切片的上端)
但是定义的切片没有对步长step做处理,也没有对负数做处理。
__setitem__()方法,把对象视作list或dict还对集合赋值
__delitem__()方法,用于删除某个元素
上面的方法,组合定义起来可以表现得和自带的list、tuple、dict没什么区别。
__getattr__(),为避免类外部调用不存在的属性时,如例子中的score,可以写一个__getattr__()方法,动态返回一个属性。当调用不存在的属性时,就会通过调用__getattr__(self,'score')来尝试获得属性。
也可以返回一个函数(返回匿名函数lambda:),只是调用方式要变为类名加函数名。
因为定义了__getattr__,当属性不存在时,就会返回None。要让class只响应特定的几个属性,出错是可以抛出事先定义的raise AttributeError的错误。
把一个类的所有属性和方法调用全部动态化处理了,可以针对完全动态的情况调用。
__call__(),在类中定义该方法,可以直接对实例进行调用,来代替insdtance.method(),来调用实例方法。其还可以定义参数,
callable(),用于判断一个对象是否能被调用。如果类中包含__call__(),那应该是可以被调用的。