分类:
2008-10-15 13:40:26
从编写过程式脚本转换到面向对象的编程通常是非常困难的。本文探索如何重用来自 PHP、Bash 或 Python 脚本的程序,转换到 Python 中的面向对象的编程。本文还将简略地谈到函数式编程的适当使用。
引言
Python 在近年来的受欢迎程度剧增,部分原因在于该语言非常灵活,同时功能非常强大。Python 可用于系统管理、Web 开发、GUI 编程、科学计算等等。本文的主要目标是向习惯于使用 Bash、PHP 或其它某种语言编写脚本过程代码的人介绍面向对象的 Python 开发,并帮助他们转换到面向对象的 Python 开发。Python 的这种日益流行性意味着,对于目前使用其他编程语言的开发人员,除了使用他们最喜欢的语言之外,他们还可以采用 Python 来完成某些项目。
过程式编程当然有其用武之地,并且可能是解决某个问题的高度有效的方法。在非常基本的层次上,过程式编程可定义为指令的列表,Bash 和 PHP 通常就是以这样的方式编写的。然而由于 Python 的流行,对于作为 Web 开发人员或系统管理员的 PHP 和 Bash 脚本编写人员,他们正陷入必须同时学习面向对象的编程和 Python 的境地。
面向对象这个概念很难一次性地掌握,因此本文采用过程式 Bash 和 PHP 脚本,并首先将它们转换为过程式 Python。作为最后一步,它们将转换为面向对象的 Python 这个终结目标。本文在结束时将简略讨论一下面向对象的 Python 的一些优点,然后在最后讨论一些可能更适合采用过程或函数式编程的一些不利场景。到本文结束时,Bash 或 PHP 程序员应该能够毫无畏惧地一头扎进面向对象的 Python 项目。
采用 PHP 和 Bash 编写磁盘监视函数
虽然 PHP 主要是为了在浏览器中运行,但是也可以通过 exec 函数执行系统调用。采用 PHP 编写的第一个示例将捕获 Shell 命令“df –h”的输出,将输出放在一个数组中,然后根据一个正则表达式检查输出的每一行。如果该行与正则表达式匹配,则打印该行。如果您希望从主目录运行此示例,只需将此脚本命名为 index.php,并将其放在 Apache/mod_php 的对外服务目录中。
PHP 磁盘监视示例
//Analyzes disk usage //Takes regex pattern and message function disk_space( $pattern="/2[0-9]%/", $message="CAPACITY WARNING:" ) { exec(escapeshellcmd("df -h"),$output_lines,$return_value); foreach ($output_lines as $output) { if (preg_match( $pattern, $output )) echo "$message $output "; } } disk_space() ?> |
如果您在浏览器中运行此网页,将会获得以下结果:
CAPACITY WARNING: /dev/sda1 3.8G 694M 2.9G 20% / |
查看该代码,可以看到正则表达式模式被设置为匹配某个包含 20-29% 的行。可以容易地修改此模式以适应其他标志,例如 90-99%,因为 20% 是非常低的磁盘容量。
下面让我们看一下如何在 Bash 函数中完成同样的事情。在 Bash 中,该问题要容易解决得多,因为您实际上是在处理系统调用。在此示例中,您甚至不需要使用数组或正则表达式库,因为使用到 grep 的管道容易多了。不过,在 Bash 中设置函数的缺省参数始终有点麻烦。
Bash 磁盘监视示例
#!/usr/bin/env bash #function flags disk usage takes pattern and message optionally function disk_space () { #checks for pattern parameter if [ "$1" != "" ]; then pattern=$1 else pattern="2[0-9]%" fi #checks for message parameter if [ "$2" != "" ]; then message=$2 else message="CAPACITY WARNING:" fi #looks at output for pattern to flag output_lines=`df -h | grep $pattern` if [ "$output_lines" != "" ]; then echo $message $output_lines fi } #example of optional parameters usage #disk_space 9[0-9]% ALERT: disk_space |
[1]