捆绑方法包装器

时间:2014-09-05 14:33:22

标签: python class methods import module

我正在尝试创建一个捆绑所有包装器的类。我正在尝试创建自定义etree方法,我可以在我制作的所有项目中使用它们。

当我尝试执行以下操作时,我收到名称错误。

class ObjectWrapper(object):
    from lxml import etree

    @classmethod
    def stringify(cls, root):
        return etree.tostring(root, pretty_print=True)

    @classmethod
    def node_creator(cls, parent, child):
        ch_node = etree.Element(child)
        parent.append(ch_node)
        print "Child Node Created"
        return ch_node

将此类视为以下结构。

  TopModule
      |
      |
      |
      |_
         object_wrapper.py
                |
                |
                |
                |_
                   ObjectWrapper()

当我从TopModule.object_wrapper导入ObjectWrapper时,我收到错误说

Name error: global name "etree" is not defined

如果我进行全局导入并将classmethods变为静态方法,也会发生同样的情况。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

你所拥有的是一个范围问题。 etree在类中定义,但在方法中没有作用域。 要解决这个问题,请在方法中声明global ET,以便他们了解变量。在这种情况下,lxml.etree必须导入as某些内容,以便可以使用global引用它。如果您不想使用global,请在from lxml import etree之上和之外声明class

class ObjectWrapper(object):
    import lxml.etree as ET

    @classmethod
    def stringify(cls, root):
        global ET
        return ET.tostring(root, pretty_print=True)

    @classmethod
    def node_creator(cls, parent, child):
        global ET
        ch_node = ET.Element(child)
        parent.append(ch_node)
        print "Child Node Created"
        return ch_node

或另一种选择......

from lxml import etree
class ObjectWrapper(object):

    @classmethod
    def stringify(cls, root):
        return etree.tostring(root, pretty_print=True)

    @classmethod
    def node_creator(cls, parent, child):
        ch_node = etree.Element(child)
        parent.append(ch_node)
        print "Child Node Created"
        return ch_node