全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析师(CDA)专版
430 0
2022-04-25

作者:麦叔

来源:麦叔编程

扩展内置类

我们知道继承是面向对象编程的最重要特征之一。

  • 牧羊犬可以继承自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内容精选
  • 大厂数据分析面试指南!来自亚马逊、谷歌、微软、头条、美团的面试问题!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群