python面向对象编程(5)

今天我们来学习几个类内置方法,分别是:

__str__

__repr__

__call__

__setitem__

__getitem__

__delitem__

__eq__

可能大家对类内置方法并不熟悉,但是其实我们在以前就已经用过它了,比如经常使用到的__init__就是其中的一个,它叫做构造方法,用来创建对象的各种属性。下面我们一起来学习其它的几个类内置方法。__str__看到名字大家就应该想到了,这是和字符串相关的类内置方法,下面我们来看它的应用。我们先来创建一个人类,实例化出一个名字为张三,年龄为18岁的对象,然后把名字和年龄打印出来。

然后我们就想了,有没有一种方法可以通过打印实例化对象就把名字和年龄打印出来呢?这个我们先不用管,我们先来看看直接打印实例化对象会输出什么。

输出结果的大概意思就是类名和其所在的内存地址,这个显然不是我们想要的结果,这个是面向开发者的,为了使用户能够清楚地看到输出的信息。于是乎python就有了__str__这个类内置方法,而这个方法返回的结果才是格式化后的面向用户的信息。看下面的例子

这个结果就友好多了。__repr__上面我们已经说过了,__str__面向的是用户,而__repr__则和__str__相反,它面向的是开发者,用于调试。看例子

可以看到,执行的是方法__str__我们把__str__方法注释掉,看看会发生什么

可以看到,现在执行的是__repr__方法,也就是说,__str__方法的执行顺序是排在__repr__前面的。__call__简单地说,__call__方法可以让我们像调用方法一样调用实例化对象。

可以看到,执行的是__call__方法。我们把__call__方法注释掉,看看会发生什么?

看报错原因,知道为什么函数名叫__call__了吧。当然,既然是函数,那么我们就可以传递参数

__setitem____getitem____delitem__这三个可以归为一类,所以就放在一起讲了。这三种方法可以让我们像操控列表一样来操控实例。

接着我们给类添加一个字典,再来看看代码演示

可以看到,赋值、获取、删除这三个方法都已经成功执行看完了索引,我们再来看看切片

注意看红框部分,它其实是Slice类的实例,而很容易想到0,5,3分别是开始,结束和步长。从上面的例子可以看到,切片操作也已经完成,上面只有赋值操作,获取和删除操作也是同一个道理,读者们可自行敲代码操作一下。__eq__eq是equal的缩写,比较的是两个实例化对象是否相等

当出现两个实例化对象相等的语句时,就会执行__eq__方法,self是p1,other是p2。当然,有相等,自然就有不等,大于,小于,大于等于,小于等于,它们对于的方法分别是__ne____gt____lt____ge____le__,道理和相等的用法是一样的,读者们举一反三即可。不过,有一点大家需要注意,如果类中没有想要的方法,则会自动去查找该方法的反方法并进行参数调换,比如不等的反方法是相等,小于的反方法是大于。举个简单的例子

把p1

p2之后,注意p1

=p2

由于类中没有定义大于方法,则执行小于方法并进行参数调换,也就是说现在self是p2,other是p1。除了上面介绍的类内置方法之外,还有很多其它的方法,就不在这里一一列举了,蛇友们可以自行查阅资料学习。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180720G11SY400?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券