Python面向对象高级编程——定制类

定制类的内容算是面向对象高级编程里内容比较多的一部分了。廖老师主要讲解了五个定制类

首先是__str__,其实这里还引入了另一个和他有相似之处的定制类__repr__(),两者的区别是__str__()返回用户看到的字符串,而__repr__()返回程序开发者看到的字符串,也就是说,__repr__()是为调试服务的。

__iter__   方法:返回一个迭代对象

如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。

我们以斐波那契数列为例,写一个Fib类,可以作用于for循环:

__getitem__  方法:按照下标取出元素

要表现得像list那样按照下标取出元素,需要实现__getitem__()方法:

对于Fib却报错。原因是__getitem__()传入的参数可能是一个int,也可能是一个切片对象slice,所以要做判断:

值得注意的是如果把对象看成dict__getitem__()的参数也可能是一个可以作key的object,例如str

__getattr__  方法:动态返回一个属性

正常情况下,当我们调用类的方法或属性时,如果不存在,就会报错。比如定义Student

但是当我们引入了__getattr__  呢

不仅如此,利用完全动态的__getattr__,我们可以写出一个链式调用:

现在很多网站都搞REST API,比如新浪微博、豆瓣啥的,调用API的URL类似:

  • http://api.server/user/friends
  • http://api.server/user/timeline/list

__call__   方法: 直接对实例进行调用

一个对象实例可以有自己的属性和方法,当我们调用实例方法时,我们用instance.method()来调用。能不能直接在实例本身上调用呢?在Python中,答案是肯定的。

任何类,只需要定义一个__call__()方法,就可以直接对实例进行调用

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值