子类化Python类,其中许多方法创建同一个类的新实例

时间:2015-05-27 23:39:06

标签: python xml subclass mixins bs4

我想扩展一个处理HTML或XML结构的Python(2.7)类。目前我正在摆弄bs4,但这对于这个问题可能并不重要。

我想添加一堆执行更高级别操作的函数;比如说,操纵整个表列,排序列表子元素等等。所以我定义了一个子类

class myBS4 (bs4.BeautifulSoup):
    def sortChildren(self, keyPath,...):
    ...

到目前为止很好。但是原始类(以及像Tag,NavigableString等相关的类)已经有各种方法来实例化bs4对象,例如new_tag()来制作一个" Tag" (Element),new_string()来创建NavigableString(Text节点)等。与基于DOM的类相同,或者可能是处理递归数据结构的任何包。

这是否意味着我必须在每个与bs4相关的类中找到实例化bs4相关对象的每个位置,并且子类和覆盖以便它们都实例化我的类?这看起来非常乏味。

更糟糕的是,它似乎很容易出现微妙的错误。例如,bs4构造函数从解析的HTML或XML构造一个准DOM树;但这样做可能会也可能不会调用new_tag()。它可能只是说像

x = Tag("div")

在这种情况下,我会获取BeautifulSoup和Tag以及NavigableString对象的实例,混合到myBS4和myTag以及myNavigableString对象的树中。当要求在非扩展节点上执行扩展操作时,调用将失败。

所以重写new_tag()等可能还不够;了解所有案例的唯一方法是研究(或grep)整个bs4实现。而bs4更新可能很有可能打破它,即使根本没有触及bs4本身的概念理由。

这个问题有什么干净的方法吗?我想到了mixins,但据我所知,我仍然需要继承bs4来引入mixin,所以它不会有帮助。我完全错过了什么吗?

0 个答案:

没有答案