如何间接创建对象时的子类

时间:2015-06-08 21:56:44

标签: python class inheritance

我想为来自lxml的html树添加一些功能。

因此我想添加一个类,使用super().__init__()并添加额外的功能,例如为每个节点添加深度,为isLeafNode添加布尔值,以及实现view方法

问题开始的地方,因为我可能会使用lxml.html.fromstring('<p>test</p>')初始化lxml类。

这是我到目前为止所得到的:

class Elhanced(lxml.etree._ElementTree): 
    def __init__(self, htmlString): 
        super().__init__()
        self.x = 'useful'   
        self.tree = lxml.html.fromstring(htmlString)   # Issue

    def useful_function():
        pass

但是,我实际上希望对象是增强的 lxml对象具有附加功能,而不是可通过self.tree访问的树,而其他属性可在self访问。

如何将功能添加到增强的lxml对象?

我想像这样初始化:

el = Elhanced('<p>test</p>')

其中el包含lxml的所有方法(例如el.xpath应该存在),以及el.useful_function()el.x

也许甚至还有一种更好的方法,我现在还没有看到。

1 个答案:

答案 0 :(得分:2)

您只需使用继承 - 无需担心维护agregate self.tree实例:您的子类只有原始超类的行为才能覆盖它。

唯一不直接的部分正是因为某些原因,lxml库旨在使您难以为其提供一个简单的字符串来解析(从而提供外部fromstring工厂)。

如果使用类似文件的对象调用实例parse方法,则可以进行解析 - 因此在调用parse之前必须将普通字符串转换为该字符串。是的,它可以在__init__内完成。试试吧:

import lxml.etree
# Python 2/3 compatibility
try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO

class Elhanced(lxml.etree._ElementTree): 
    def __init__(self, htmlString): 
        super(Elhanced, self).__init__()
        self.x = 'useful'   
        self.parse(StringIO(htmlString), lxml.etree.HTMLParser())

    def useful_function():
        pass