我想用新的属性和方法扩展一个对象,但是在运行时。基本上我宁愿继承和扩展一个类,但基类的新对象通常不是使用它的构造函数创建的,而是使用相当复杂的函数。
而不是......
from win32com import client
excel = client.Dispatch("Excel.Application")
excel.Visible = 1
excel.Workbooks.Add()
print(excel.Range("A1").value)
......我需要类似(明显破碎)的东西:
from win32com import client
class Excel(client.CDispatch):
def __init__(self):
self = client.Dispatch("Excel.Application")
def get(self, cell):
return self.Range(cell).value
def show(self):
self.Visible = 1
excel = Excel()
excel.show()
excel.Workbooks.Add() # I want this to be still working
print(excel.get("A1"))
我仍然希望能够使用原始方法和属性,还有我的新方法和属性。我无法绕过这个概念,我甚至不确定如何称呼这个原则。有什么想法吗?
获得所需功能的另一种方法是:
from win32com import client
class Excel():
def __init__(self):
self.excel = client.Dispatch("Excel.Application")
self.Workbooks = self.excel.Workbooks
# I do not really want to repeat all base class
# functionality here to bind it to my new class
def get(self, cell):
return self.excel.Range(cell).value
def show(self):
self.excel.Visible = 1
excel = Excel()
excel.show()
excel.Workbooks.Add()
print(excel.get("A1"))
然而,这需要我做很多与self.Workbooks = self.excel.Workbooks
类似的行。
答案 0 :(得分:3)
实现继承主要是组合/委托模式的变体。好消息是Python使代表团变得非常容易。我没试过(不在Windows上工作),但下面的代码片段可能正常工作:
from win32com import client
class Excel(object):
def __init__(self):
self._app = client.Dispatch("Excel.Application")
def get(self, cell):
return self._app.Range(cell).value
def show(self):
self._app.Visible = 1
def __getattr__(self, name):
try:
return getattr(self._app, name)
except AttributeError:
raise AttributeError(
"'%s' object has no attribute '%s'" % (type(self).__name__, name))