作者:麦叔
来源:麦叔编程
扩展内置类我们知道继承是面向对象编程的最重要特征之一。
- 牧羊犬可以继承自Dog类,就算不写一行代码,就拥有了Dog的基本特征和行为。
- 中学生可以继承自Student类,自动就拥有了学号,姓名等属性。
除了在自己定义的类中使用继承,我们还可以继承内置类,让内置类更强大,更好用。
list是最常用的内置类,作为一个内置类,它提供了多个好用的方法:
'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort' 但是它的查找功能不够强大,比如:我要查找所有包含麦字的字符串,它就没有现成的功能。
再说一次,我们的要求是:能够方便地查找list中包含某个字符串的所有元素。
普通青年的方法实现这个功能并不难,我们甚至可以用一句话就能实现出来:
[x for x in elements if keyword in x]我们也可以把它放到一个方法中:
def find(elements, keyword): return [x for x in elements if keyword in x]names = ['麦叔', '麦子', '周五好', '不麦', '周末好', '核酸检测了吗?']result = find(names, '麦')print(result)打印结果:
['麦叔', '麦子', '不麦'] 这个实现没有问题,但它也有一些不足之处,比如:
- 不够面向对象。如果能够直接写成names.find('麦'),肯定是更简单直观的。
- 方法find容易和其他方法产生名称冲突。在一个大型的程序中,可能会有很多文件,说不定就有另外一个find方法和你产生了冲突。
- 如果方法都没有封装,直接使用那一行代码,虽然方便,但是每个用过的地方都需要重写一次,也可能会写错。也不方便初学者使用。
文艺青年的方法或许有另外一种更好的方法,那就是扩展内置的list类。我们来看看:
class mailist(list): def find(self, keyword): return [x for x in self if keyword in x]names = mailist()names.extend(['麦叔', '麦子', '周五好', '不麦', '周末好', '孙子', '核酸检测了吗?', '不要啊'])print(names.find('麦'))print(names.find('子'))print(names.find('不'))打印结果:
['麦叔', '麦子', '不麦'] ['麦子', '孙子'] ['不麦', '不要啊'] - 我们定义了mailist,让它继承自内置的list,并添加了find方法。
- 在初始化的时候会稍微有点麻烦,我们需要先创建空的mailist,然后再用extend方法把初始元素添加进去。以后的操作和list完全一样。
- 重点是,接下来我们就可以非常方便地使用list方法了。
你应该普通还是文艺?其实吧,做一个普通青年也挺好的。
麦叔就是一个再普通不过的青年。
如果你只是写少量的代码,我也建议你就普通就好了。
但如果你的代码中经常要使用这个方法,或者你有一个团队在协作。你们是可以考虑根据你们的项目需要封装一个更强大的list。
上面的find只是一个简单的例子,你完全可以根据自己的需要,给list添加更多有用方法。
这样你的团队使用起来会非常方便,提高效率,也不容易犯错。
相关帖子DA内容精选
- 大厂数据分析面试指南!来自亚马逊、谷歌、微软、头条、美团的面试问题!
|