从导入的库python-pptx扩展类时遇到困难

问题描述

设置:

  • 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'

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

解决方法

您通过 Presentation 获得的 from pptx import 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) 文档、创建 {{1 }} 对象,并返回该对象。 https://github.com/scanny/python-pptx/blob/master/pptx/api.py#L18

所以 pptx.presentation.Presentation 看起来和行为都像一个类,但它不是。如果您想要自己的 pptx.Presentation 版本,则必须按照 pptx.Presentation 函数而不是它返回的对象对其进行建模。

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

你可以做的是组合一个pptx.api.Presentation对象,然后用“包含”它的类来操作它。

另一种选择是 fork Presentation 并扩展它以适合您的目的。当然,你也是靠自己的方式。

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