【问题标题】:Having difficulties extending a class from an imported library (python-pptx)从导入的库(python-pptx)扩展类时遇到困难
【发布时间】:2021-09-25 13:46:53
【问题描述】:

设置:

  • Python 3.6
  • python-pptx
  • openpyxl
  • openpyxl-image-loader

我的目标:
扩展 Presentation 类以包含更多功能以构建独特的 PPT 幻灯片 我不希望覆盖任何以前的__init__()

到目前为止我的进展:
我使用type() 来查看我应该扩展什么类。

from pptx import Presentation
prs=Presentation('template.pptx')
print(type(prs))
>><class 'pptx.presentation.Presentation'>

然后我创建了一个继承pptx.presentation.Presentation的新类:

class Build_ppt(pptx.presentation.Presentation):

   def build_cover(self,i,ws):
   #i : index
   #ws: is an openpyxl instance
       pass

然后我尝试调用新的Build_ppt 类,类似于你调用Presentation 的方式:

prs=Build_ppt('template.pptx')

我收到以下错误:

TypeError: __init__() missing 1 required positional argument: 'part'

或者有时它确实通过了,但超类没有传入正确的参数。

【问题讨论】:

  • 无法在模块中扩展类是很常见的,尤其是那些用其他语言(如 C/C++)编写的类。一种解决方法是定义一个“代理”类,该类具有要在其中扩展而不是从其中派生的类的实例。代理类的方法委托调用这个实例可能有这样的预处理和/或后处理。 my answer 中有一个针对不同问题的简单示例。另请参阅 Wikipedia 的 Proxy pattern 文章。

标签: python class inheritance python-3.6 python-pptx


【解决方案1】:

您使用from pptx import Presentation 获得的Presentation 对象与pptx.presentation.Presentation 不同。

如果您查看pptx/__init__.py,您可以看到from pptx.api import Presentation。这就是确定您引用为pptx.Presentation 的原因。 https://github.com/scanny/python-pptx/blob/master/pptx/__init__.py#L14

如果您查看pptx/api.py,您会看到Presentation 是一个函数,它需要打开一个演示文稿(.pptx) 文档,用它创建一个pptx.presentation.Presentation 对象,并返回该对象。 https://github.com/scanny/python-pptx/blob/master/pptx/api.py#L18

所以pptx.Presentation 看起来和行为都像一个类,但它不是。如果你想要你自己的pptx.Presentation 版本,你必须在pptx.api.Presentation 函数之后建模它,而不是它返回的对象。

但是,我不建议您这样做。有很多复杂性,您将完全靠自己,因为您从那里所做的一切都在“标签外”领域,而不是使用已发布的界面。

您可以做的是组合 Presentation 对象,然后使用“包含”它的类对其进行操作。

另一种选择是 fork python-pptx 并扩展它以满足您的目的。当然,你自己也是如此。

第三种选择是使用python-pptx,因为它可以用于任何你能做的事情,并编写“扩展”函数来做python-pptx 不能直接为你做的事情。这是一种非常常见的方法,我自己也经常使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-02
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多