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添加更多有用方法。

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

推荐阅读

睡在我上铺的室友用python,一个月挣了我一学期的生活费

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值