登录
首页精彩阅读Python继承竟然还有这样的玩法?扩展内置类
Python继承竟然还有这样的玩法?扩展内置类
2022-03-11
收藏
Python继承竟然还有这样的玩法?扩展内置类

作者:麦叔

来源:麦叔编程

扩展内置类

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

  • 牧羊犬可以继承自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)

打印结果:

['麦叔', '麦子', '不麦'] 

这个实现没有问题,但它也有一些不足之处,比如:

  1. 不够面向对象。如果能够直接写成names.find('麦'),肯定是更简单直观的。
  2. 方法find容易和其他方法产生名称冲突。在一个大型的程序中,可能会有很多文件,说不定就有另外一个find方法和你产生了冲突。
  3. 如果方法都没有封装,直接使用那一行代码,虽然方便,但是每个用过的地方都需要重写一次,也可能会写错。也不方便初学者使用。

文艺青年的方法

或许有另外一种更好的方法,那就是扩展内置的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添加更多有用方法。

这样你的团队使用起来会非常方便,提高效率,也不容易犯错。

数据分析咨询请扫描二维码

最新资讯
更多
客服在线
立即咨询