定制类(__str__,__iter__,__getitem__,__gettar__)
admin
2023-07-30 20:47:00
0

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__()

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...