我正在工作中编写一个Python脚本,用于与XLS / XLSX / CSV电子表格进行交互。有三个主要的类嵌套在一起(不是相互扩展的,这些类实际上是嵌套在另一个类内部)。
下面解释了三个主要的类:
所以我的问题是 - 在类中嵌套另一个类,再次嵌套第三个类是否被认为是不好的实践?
我对Python有些陌生,我的经验主要集中在PHP/JS/Perl上。在Python中,在类内部嵌套另一个类似乎并不太罕见,但由于某种原因,将一个类嵌套到三层深度中似乎是错误的。如果是这样,并且有更好的方法来解决它,那就太好了。
我知道的替代方法是不要嵌套类,而只需检查是否将
示例:
然而,这种替代方案意味着
下面解释了三个主要的类:
- 主要的
Workbook
类,是XLS / XLSX / CSV类的工厂方法。这可以从外部访问 Workbook
类中的私有__Worksheet
类,用于打开文件中的特定电子表格或工作表。只能通过Workbook.worksheet()
方法访问__Worksheet
类中的私有__Cell
类,用于与单元格交互。这不应从外部访问,而应仅通过__Worksheet
类访问
class Workbook( object ):
def __init__( self, file_name ):
self.__file_name = file_name
def worksheet( self, name ):
return self.__Worksheet( self, name )
class __Worksheet():
def __init__( self, workbook, worksheet ):
self.__workbook = workbook
def cell( self, cell_id, data = None ):
return self.__Cell( cell_id, data )
class __Cell():
def __init__( self, cell, data = None ):
self.__cell = cell
self.__data = data
def setVal( self, data ):
self.__data = data
def __str__( self ):
return self.__data
workbook = Workbook( 'test-file.csv' )
worksheet = workbook.worksheet( 'First Worksheet' )
cell_A1 = worksheet.cell('A1', 'Foo...')
print("Before - Cell A1: %s" % cell_A1) # => Before - Cell A1: Foo...
cell_A1.setVal('Bar...')
print("After - Cell A1: %s" % cell_A1) # => Before - After - Cell A1: Bar...
所以我的问题是 - 在类中嵌套另一个类,再次嵌套第三个类是否被认为是不好的实践?
我对Python有些陌生,我的经验主要集中在PHP/JS/Perl上。在Python中,在类内部嵌套另一个类似乎并不太罕见,但由于某种原因,将一个类嵌套到三层深度中似乎是错误的。如果是这样,并且有更好的方法来解决它,那就太好了。
我知道的替代方法是不要嵌套类,而只需检查是否将
Workbook
的实例作为参数提供给Worksheet
。然后在Workbook
中创建一个方法,该方法仅返回Worksheet
的实例,同时将self
作为用于初始化它的参数之一。示例:
class Workbook( object ):
def __init__( self, file_name ):
self.__file_name = file_name
def worksheet( self, name ):
return self.Worksheet( self, name )
class Worksheet( object ):
def __init__( self, workbook, worksheet = 0 ):
if not isinstance( workbook, Workbook ):
raise Exception( 'Expected the workbook to be an instance of the Workbook class' )
self.__workbook = workbook
def cell( self, cell_id, data = None ):
return self.Cell( cell_id, data )
class Cell( object ):
def __init__( self, worksheet, cell, data = None ):
if not isinstance( worksheet, Worksheet ):
raise Exception( 'Expected the worksheet to be an instance of the Worksheet class' )
self.__cell = cell
self.__data = data
def setVal( self, data ):
self.__data = data
def __str__( self ):
return self.__data
# Example Usage One
workbook = Workbook( 'test-file.xls' )
worksheet = workbook.worksheet( 'First Worksheet' )
cell_A1 = worksheet.cell('A1', 'Foo...')
print("Before - Cell A1: %s" % cell_A1) # => Before - Cell A1: Foo...
cell_A1.setVal('Bar...')
print("After - Cell A1: %s" % cell_A1) # => Before - After - Cell A1: Bar...
# Example Usage Two
workbook = Workbook( 'test-file.xlsx' )
worksheet = Worksheet( workbook, 'First Worksheet' )
cell_A1 = Cell( worksheet, 'A1', 'Foo...')
print("Before - Cell A1: %s" % cell_A1) # => Before - Cell A1: Foo...
cell_A1.setVal('Bar...')
print("After - Cell A1: %s" % cell_A1) # => Before - After - Cell A1: Bar...
# Failed Example
worksheet = Worksheet( 'Not worksheet', 1 ) # => Exception, as expected
然而,这种替代方案意味着
Worksheet
和Cell
类可以从外部访问并可以手动初始化...但我想这不是什么可怕的事情。请告诉我您认为最好的路线是什么!
这篇文章中的一条评论提供了另一篇SO帖子的链接,其中一个用户发布了嵌套类的3个优点,第一个是:
这正是我所想的。我只是觉得将它们嵌套到3层有些尴尬,因为我以前只做过2层。类的逻辑分组:如果一个类只对另一个类有用,则将其嵌入该类并将两个类放在一起是很合理的。嵌套这样的“helper classes”可以使它们的包更加流畅。