扩展内置类
我们知道继承是面向对象编程的最重要特征之一。
- 牧羊犬可以继承自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添加更多有用方法。
这样你的团队使用起来会非常方便,提高效率,也不容易犯错。