Python多重继承可能是非常有用的方法。然而,当项目达到某种程度的复杂性之后,过程代码通常会暴露出其根本缺陷。下面让我们直接进入一个示例的面向对象版本,并看看这样有何变化。
#!/usr/bin/env python from subprocess import Popen, PIPE import re class DiskMonitor(): “””Disk Monitoring Class””” def __init__(self, pattern=”2[0-9]%”, message=”CAPACITY WARNING”, cmd = “df -h”): self.pattern = pattern self.message = message self.cmd = cmd def disk_space(self): “””Disk space capacity flag method””” ps = Popen(self.cmd, shell=True,stdout=PIPE,stderr=PIPE) output_lines = ps.stdout.readlines() for line in output_lines: lineline = line.strip() if re.search(self.pattern,line): print “%s %s” % (self.message,line) class MyDiskMonitor(DiskMonitor): “””Customized Disk Monitoring Class””” def disk_space(self): ps = Popen(self.cmd, shell=True,stdout=PIPE,stderr=PIPE) print “RAW DISK REPORT:” print ps.stdout.read() if __name__ == “__main__”: d = MyDiskMonitor() d.disk_space() |
查看该代码的面向对象版本,可以看到代码变得更加抽象。有时,太多的抽象会导致设计问题,但是在此例中,它允许您将问题分离为更多可重用的部分。DiskMonitor类具有__init__ method,您可以在其中定义新的参数,并且disk_space函数现在是该类中的一个方法。
使用这种新的样式,您无需更改原始代码即可容易地重用和自定义各个部分,而使用过程代码时则通常必须更改原始代码。Python 多重继承面向对象的设计的一个更加功能强大、通常也被过度使用的方面是继承。继承允许您在新的类中重用和自定义现有的代码。让我们在下一个示例中看看继承可能像什么样子。
此输出与前面带标记的版本区别非常大,因为它只是使用顶部注入的print语句来打印的未经筛选的df–h命令结果。通过重写 MyDiskMonitor类中的方法,您能够完全改变disk_space方法的意图。
允许您重用其他类中的属性的Python多重继承是这个“MyDiskMonitor(DiskMonitor)”语句。您只需在定义新类的名称时,将先前的类的名称放在括号内。一旦完成此步骤,您立即可以访问其他类属性来做自己希望的事情。但是乐趣不仅于此。通过添加另一个通过电子邮件来发送标记消息的方法。
也许是将其命名为disk_alert,这样就可以进一步自定义新类。这是面向对象的设计的美妙之处;它允许有经验的开发人员不断重用已编写的代码,从而节省大量的时间。 遗憾的是,面向对象的编程也有其不利的一面。所有这些抽象都是以复杂性为代价的,如果抽象过度,可能会彻底地弄巧成拙。
由于Python多重继承,抽象可以达到相当有害的复杂程度。您是否能够想象只是为了编写一个方法也要查看多个文件的情况?无论相信与否,这种情况的确会发生,并且代表了面向对象编程的不幸现实。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国