python继承vs使用对象

时间:2016-09-18 01:29:09

标签: python oop inheritance code-structure

让我们假设我有一个包含多个表的文件。我想阅读表格的内容。每个表中还有多个部分。假设我按如下方式定义了文件对象(这是我代码的一个非常粗略的布局):

from tables import TableA,TableB

class File(TableA,TableB):

   def __init__(self,filename):

      self.in_file_name=open(filename,'rb')
      self.record_bytes=self.in_bytes=''
      self.data={}

   def read(self):

       while 1:

          self._read_records():

          if unpackint(self.record_bytes)==1:
             self.read_section_A1()

          if unpackint(self.record_bytes)==2:
             self.read_section_A2()

          if unpackint(self.record_bytes)==3:
             self.read_section_B1()

          if unpackint(self.record_bytes)==4:
             self.read_section_B2()

   def _read_record(self):

       self.in_bytes=self.in_file.read(4)
       self.record_bytes=self.in_file.read(4)
       self.in_bytes=self.in_file.read(4)

以下是TableA和TableB类的定义方式:

class TableA():

   def read_section_A1(self):

       self._read_record()
       if unpackint(self.record_bytes)==5:
          self.data['A1']='TABLEA1DATA'

   def read_section_A2(self):

       self._read_record()
       if unpackint(self.record_bytes)==6:
          self.data['A2']='TABLEA2DATA'

class TableB():

   def read_section_B1(self):
       self._read_record()
       if unpackint(self.record_bytes)==6:
          self.data['B1']='TABLEB1DATA'

   def read_section_B2(self):
       self._read_record()
       if unpackint(self.record_bytes)==7:
          self.data['B1']='TABLEB2DATA'

据我所知,上面的代码基本上扩展了File类。但我想知道这是否是一种最佳实践方法(就oop而言)。如您所见,如果我尝试调用TableA或TableB类,它们将无法工作,因为它们不是独立的。此外,继承似乎并不理想,因为通常,对象继承自更通用的类。在我的应用程序中,TableA和TableB实际上是文件的一个子集。

以下是我正在考虑的事情:

from tables import TableA,TableB

class File():

   def __init__(self,filename):

      self.in_file_name=open(filename,'rb')
      self.record_bytes=self.in_bytes=''
      self.data={}

   def read(self):

       while 1:

          self._read_records():

          if unpackint(self.record_bytes)==1:
             TableA(self).read_section_A1()

          if unpackint(self.record_bytes)==2:
             TableA(self).read_section_A2()

          if unpackint(self.record_bytes)==3:
             TableB(self).read_section_B1()

          if unpackint(self.record_bytes)==4:
             TableB(self).read_section_B2()

   def _read_record(self):

       self.in_bytes=self.in_file.read(4)
       self.record_bytes=self.in_file.read(4)
       self.in_bytes=self.in_file.read(4)

TableA和B的定义如下:

class TableA():

   def __init__(self,File):
       self.File=File

   def read_section_A1(self):

       self.File._read_record()
       if unpackint(self.File.record_bytes)==5:
          self.File.data['A1']='TABLEA1DATA'

   def read_section_A2(self):

       self.File._read_record()
       if unpackint(self.File.record_bytes)==6:
          self.File.data['A2']='TABLEA2DATA'

这是首选方法吗?有没有其他方法可以改进代码?

谢谢。

0 个答案:

没有答案