如何进行创建Python 多重继承

Tristahong 2010-02-01

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 Ch 命令结果。通过重写 MyDiskMonitor 类中的方法,您能够完全改变 disk_space 方法的意图。

允许您重用其他类中的属性的 Python 多重继承是这个“MyDiskMonitor(DiskMonitor)”语句。您只需在定义新类的名称时,将先前的类的名称放在括号内。一旦完成此步骤,您立即可以访问其他类属性来做自己希望的事情。但是乐趣不仅于此。通过添加另一个通过电子邮件来发送标记消息的方法。

相关推荐