我试图理解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
。
答案 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 = {}