Python中的继承,init方法覆盖

时间:2014-04-25 07:59:07

标签: python oop inheritance

我试图理解Python中的继承。我有4种不同类型的日志要处理:cpu,ram,net和disk usage

我决定用类来实现它,因为除了日志文件读取和数据的数据类型之外,它们正式相同。我有以下代码(日志对象是自定义日志记录类的日志记录对象实例)

class LogFile():    
    def __init__(self,log_file):
        self._log_file=log_file
        self.validate_log()

    def validate_log(self):
        try:
            with open(self._log_file) as dummy_log_file:
                pass
        except IOError as e:
               log.log_error(str(e[0])+' '+e[1]+' for log file '+self._log_file)

class Data(LogFile):
    def __init__(self,log_file):
        LogFile.__init__(self, log_file)
        self._data=''

    def get_data(self):
        return self._data

    def set_data(self,data):
        self._data=data

    def validate_data(self):
        if self._data == '':
            log.log_debug("Empty data list")

class DataCPU(Data):    
    def read_log(self):            
        self.validate_log()
        reading and writing to LIST stuff

        return LIST


class DataRAM(Data):
    def read_log(self):            
        self.validate_log()    
        reading and writing to LIST stuff

        return LIST

class DataNET(Data):

现在我希望我的DataNET类成为具有更多属性的Data类的对象,特别是每个接口的字典。如何覆盖__init__()方法与Data.__init__()相同,但在不复制数据构建器的情况下添加self.dict={}?这是在没有明确指定DataNet对象的情况下确实具有._data属性,但是继承自Data

2 个答案:

答案 0 :(得分:3)

只需从Data.__init__()调用DataNET.__init__()方法,然后设置self._data = {}

class DataNET(Data):
    def __init__(self, logfile):
        Data.__init__(self, logfile)
        self._data = {}

现在首先Data.__init__()self做了什么,让DataNET初始值设定项添加新属性或覆盖父初始值设定项设置的属性。

在Python中,3个类已经是新风格,但如果这是Python 2,我将object作为基类添加到LogFile()以使其成为新风格:< / p>

class LogFile(object):

之后您可以使用super()自动查找要调用的父__init__方法;这样做的好处是,在更复杂的协作继承方案中,正确的方法以正确的顺序调用:

class Data(LogFile):
    def __init__(self,log_file):
        super(Data, self).__init__(log_file)
        self._data = ''

class DataNET(Data):
    def __init__(self, logfile):
        super(DataNET, self).__init__(logfile)
        self._data = {}

super()为您提供了绑定方法,因此在这种情况下,您不需要将self作为参数传递给__init__。在Python 3中,您可以完全省略super()的参数:

class Data(LogFile):
    def __init__(self,log_file):
        super().__init__(log_file)
        self._data = ''

class DataNET(Data):
    def __init__(self, logfile):
        super().__init__(logfile)
        self._data = {}

答案 1 :(得分:2)

使用新样式类(从对象继承) - 将LogFile的定义更改为:

class LogFile(object):
Data

init 方法:

def __init__(self, log_file):
    super(Data, self).__init__(log_file)
    self._data = ''

然后您可以将DataNET定义为:

class DataNET(Data):
    def __init__(self, log_file):
        super(DataNET, self).__init__(log_file)
        self.dict = {}