允许您重用其他类中的属性的 Python 魔法是这个“MyDiskMonitor(DiskMonitor)”语句。您只需在定义新类的名称时,将先前的类的名称放在括号内。一旦完成此步骤,您立即可以访问其他类属性来做自己希望的事情。但是乐趣不仅于此。通过添加另一个通过电子邮件来发送标记消息的方法。
也许是将其命名为 disk_alert(self),这样就可以进一步自定义新类。这是面向对象的设计的美妙之处;它允许有经验的开发人员不断重用已编写的代码,从而节省大量的时间。 遗憾的是,面向对象的编程也有其不利的一面。所有这些抽象都是以复杂性为代价的,如果抽象过度,可能会彻底地弄巧成拙。
由于 Python 支持多重继承,抽象可以达到相当有害的复杂程度。您是否能够想象只是为了编写一个方法也要查看多个文件的情况?无论相信与否,这种情况的确会发生,并且代表了面向对象编程的不幸现实。
面向对象的编程的替代方案是函数式编程,并且 Python 提供了用于进行函数式以及面向对象和过程式编程的资源。在最后一个示例中,我们将研究如何以函数式的方式编写现已变得非常无聊的磁盘监视代码。
- from subprocess import Popen, PIPE
- import re
- def disk_space(pattern="2[0-9]%", message="CAPACITY WARNING:"):
- #Generator Pipeline To Search For Critical Items
- ps = Popen("df -h", shell=True,stdout=PIPE, stderr=PIPE)
- outline = (line.split() for line in ps.stdout)
- flag = (" ".join(row) for row in outline if re.search(pattern, row[-2]))
- for line in flag:
- print "%s %s" % (message,line)
- disk_space()
查看这最后一个示例,它与您从本文中看到的所有其他代码的区别都非常大。如果您逐行浏览该代码,可以首先从 “ps”变量中以前未见过的内容开始。接下来的两行代码使用生成器表达式来处理文件对象 ps.stdout。
分析该文件并在其中搜索您正在查找的行。如果您将这些代码行剪切并粘贴到交互式的 Python Shell 中。如果打印的话,您将看到概要和标志都是生成器对象。生成器对象附带有下一个方法,因而允许您通过“管道”将操作连在一起。
概要行从一行中去除新行字符,并往下将该行传递给下一个生成器表达式,后者一次一个地在每行中搜索某个正则表达式匹配项,然后将输出传递给标记。此类紧凑的工作流可以替代面向对象的编程样式,并且相当有趣。然而,这种样式也有缺点,因为代码的简洁性会导致难于调试的错误。
除非独立地执行每一行代码。函数式编程还很伤脑筋,因为它让您通过将解决方案链接在一起来考虑解决问题。无论是从过程式还是从面向对象样式的角度看,这都是相当不同的。
本文有点试验性质,因为它从 Bash 和 PHP 谈到了过程、面向对象,并在最后谈到了使用相同基本代码的函数式 Python。但愿本文说明了 Python 是一种非常灵活和功能强大的语言。
其他编程语言的开发人员也可以学习欣赏。随着 Python 的越来越流行,其他开发人员除了首选语言之外,学习 Python 也将变得更加重要。 Python 最近的两个最大的发展领域是 Web 开发和系统管理。就 Web 开发而言,PHP 开发人员可能很快就必须做出每周的选择,即哪个项目采用 Python 更有意义。
以及哪个项目采用 PHP 更有意义。对于系统管理员、Bash 和 Perl 脚本程序员,他们经常被要求采用 Python 完成某些项目。部分是因为这是没有选择的,部分是因为许多供应商正在为他们的产品提供 Python API。在您的工具箱中准备一点 Python 决不会伤害任何人。
【编辑推荐】