使用继承在运行时扩展Python对象

时间:2014-10-03 07:21:55

标签: python inheritance python-3.x dynamic com

我想用新的属性和方法扩展一个对象,但是在运行时。基本上我宁愿继承和扩展一个类,但基类的新对象通常不是使用它的构造函数创建的,而是使用相当复杂的函数。

而不是......

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类似的行。

1 个答案:

答案 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))