Python类中,有着很多有特殊用途的变量或函数名,其中包括了帮我们定制类的__str__,__iter__,__getitem__,__getattr__函数
__str__
当我们定义一个类时,并对类中的某个对象赋值,输出时,输出的是某某类的一个对象at地址:如下
当我们使用__str__时,直接是使用print输出一个对象时显示比较易懂,但是当你把对象赋值给一个变量时,不使用print,输入对象直接输出时,输出与没使用__str__无异。实例如图:
原因时直接显示变量调用的是__repr__(),而不是__str__(),而两者的区别是__str__返回的是用户看到的字符串,而__rept__返回的是程序员看到的字符串,即__rept__是为调试服务的,解决该差异的方法则是再定义__rept__(),而通常__str__与__rept__代码是相同的,有个偷懒的方法__rept__= __str__表示两函数的定义完全相同。
__iter__
如果功能需求是需要返回一个迭代对象,则需要用到__iter__(),该方法返回的是一个迭代对象,然后Python的for循环就会不断调用该迭代对象的next()方法拿到下一个值,直到遇到StopIteration错误时退出循环。但是__iter__不能像list一样按照下标读取元素
以斐波那数列为例,我们都知道斐波那数列第一个元素为1,后面的一个元素是前连个元素之和:
__getitem__()
如想像list用过下标读取元素,需要实现__getitem__():实现时传入的是一个int类型,即下标。
如想实现list的切片效果,即还如一个区间,则需在__getitem__()内做判断:
上例并未对负数或者越界做处理,所以要正确使用__getitem__(),还要在函数里多做判断。
此外,如果把对象看成dict,__getitem__()的参数也可能是一个可以作key的object,例如str。
与之对应的是__setitem__()方法,把对象视作list或dict来对集合赋值。最后,还有一个__delitem__()方法,用于删除某个元素。
__getattr__()
当访问某类中的属性或者方法时,该属性或者方法不存在时,则需要调用到__getattr__(),该方法返回一个动态的属性,或者方法
上例中只对不存在属性age做了判断,当我访问属性score时,__getattr__()没有对该属性进行判断,所以返回空。
2024 - 快车库 - 我的知识库 重庆启连科技有限公司 渝ICP备16002641号-10
企客连连 表单助手 企服开发 榜单123