對于Python靈活性說明介紹
允許您重用其他類中的屬性的 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 決不會傷害任何人。
【編輯推薦】