【发布时间】:2022-01-12 07:38:56
【问题描述】:
我想编写一个行为/看起来类似于 win32com Excel 单元格分配的 Python 类(需要包装它)。我想要有类似的行为,即
ws.Cells(r,c).Value = x # win32com
myws.setCell(r,c,v) # "classical" object method in Python
myws(r,c).Value = x # what I want / need with my own class
myws.Cells(r,c).Value = x # what I want / need with my own class
我发现可以使用__setattr__ 方法,但这不一样,因为我想混合使用myws.x[r][c] = v 和myws.setCell(r,c,v) 两种样式。
我什至不知道如何通过__setattr__实现myws.x[r][c] = v。
这可能吗?
编辑: 我不想复制 win32com,但我想构建一个看起来与 win32com 相似(不完全相同)的值分配包装器,因为我动态地构建我的 Excel 内容并在最后通过一个调用写入 Excel,当我知道所有的细胞。
编辑2: 这不起作用:
class Cells():
def __init__(self):
self.Value = 0
class Worksheet(object):
def __init__(self):
self.cells = []
def Cells(self,r,c):
cell = Cells()
self.cells.append(cell)
return cell
ws = Worksheet()
ws.Cells(1,1).Value = 42
print(ws.Cells(1,1).Value)
print(ws.cells)
【问题讨论】:
-
为此,您还需要
__setitem__(以及相应的__get...__方法,可能还有__call__)。你应该先尝试一下这些方法,看看它们是如何工作的。 -
如果我理解问题描述,
__setattr__在这里没有用处。您希望__setitem__用于方括号语法,__call__用于括号语法(我强烈建议不要这样做)。要使__call__方法起作用,您将需要一个代理来表示一个单元格。要使myws[r][c]工作,您需要使用__getitem__接收r并返回一行的代理,然后让代理的__setitem__接受c并设置单元格值。 -
在 Excel 对象模型中有 2 种对象类型(类):“工作簿”和“单元格”。所以你可能需要在 Python 中有两个类:Workbook、Cell
-
我可以举个例子;但由于您询问的是一般技术,因此最好在问题中使用简单、完整的minimal reproducible example。它不需要与电子表格或任何东西交互,但它应该以某种方式对数据的二维存储进行建模(可能使用嵌套列表)。
标签: python class operator-overloading