定制类(__str__,__iter__,__getitem__,__gettar__)

699 查看

Python类中,有着很多有特殊用途的变量或函数名,其中包括了帮我们定制类的__str__,__iter__,__getitem__,__getattr__函数

__str__

当我们定义一个类时,并对类中的某个对象赋值,输出时,输出的是某某类的一个对象at地址:如下



未使用__str__

当我们使用__str__时,直接是使用print输出一个对象时显示比较易懂,但是当你把对象赋值给一个变量时,不使用print,输入对象直接输出时,输出与没使用__str__无异。实例如图:


使用__str__

原因时直接显示变量调用的是__repr__(),而不是__str__(),而两者的区别是__str__返回的是用户看到的字符串,而__rept__返回的是程序员看到的字符串,即__rept__是为调试服务的,解决该差异的方法则是再定义__rept__(),而通常__str__与__rept__代码是相同的,有个偷懒的方法__rept__= __str__表示两函数的定义完全相同。

__iter__

如果功能需求是需要返回一个迭代对象,则需要用到__iter__(),该方法返回的是一个迭代对象,然后Python的for循环就会不断调用该迭代对象的next()方法拿到下一个值,直到遇到StopIteration错误时退出循环。但是__iter__不能像list一样按照下标读取元素

以斐波那数列为例,我们都知道斐波那数列第一个元素为1,后面的一个元素是前连个元素之和:


__iter__

__getitem__()

如想像list用过下标读取元素,需要实现__getitem__():实现时传入的是一个int类型,即下标。


__getitem__()

如想实现list的切片效果,即还如一个区间,则需在__getitem__()内做判断:


__getitem__()

上例并未对负数或者越界做处理,所以要正确使用__getitem__(),还要在函数里多做判断。

此外,如果把对象看成dict,__getitem__()的参数也可能是一个可以作key的object,例如str。

与之对应的是__setitem__()方法,把对象视作list或dict来对集合赋值。最后,还有一个__delitem__()方法,用于删除某个元素。

__getattr__()

当访问某类中的属性或者方法时,该属性或者方法不存在时,则需要调用到__getattr__(),该方法返回一个动态的属性,或者方法


返回属性__getattr__()

上例中只对不存在属性age做了判断,当我访问属性score时,__getattr__()没有对该属性进行判断,所以返回空。


返回方法 __getattr__()