如何進行創建Python 多重繼承
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 方法的意圖。 #t#
允許您重用其他類中的屬性的 Python 多重繼承是這個“MyDiskMonitor(DiskMonitor)”語句。您只需在定義新類的名稱時,將先前的類的名稱放在括號內。一旦完成此步驟,您立即可以訪問其他類屬性來做自己希望的事情。但是樂趣不僅于此。通過添加另一個通過電子郵件來發送標記消息的方法。
也許是將其命名為 disk_alert(self),這樣就可以進一步自定義新類。這是面向對象的設計的美妙之處;它允許有經驗的開發人員不斷重用已編寫的代碼,從而節省大量的時間。 遺憾的是,面向對象的編程也有其不利的一面。所有這些抽象都是以復雜性為代價的,如果抽象過度,可能會徹底地弄巧成拙。
由于 Python 多重繼承,抽象可以達到相當有害的復雜程度。您是否能夠想象只是為了編寫一個方法也要查看多個文件的情況?無論相信與否,這種情況的確會發生,并且代表了面向對象編程的不幸現實。