1

我试图找到一种方法来从未知nodeName领域中的未知实例化一个类(不使用eval())。

我想做类似这样的伪代码假设node是 adom node在 a 中dom tree

# create dom and get a node

class SuperNode(node):
    def __init__(self):
        # do narly node stuff

但我想根据节点名称创建类,这将是未知的。

makeInstance(SuperNode, node.nodeName, node)

为了澄清, node.nodeName 是我想成为实例变量名的节点的名称。因此,如果node.nodeName = 'clarence'它像这样实例化它(我会担心稍后按字母顺序排列节点名称以符合类命名):

clarence = SuperNode(node) ''' where node is the node specified 
                               by the name clarence'''

如果名称已知,构造函数将是这样的:

makeInstance(SuperNode, 'clarence', node) ''' where clarance will be the 
                                              instantiated variable of 
                                              class SuperNode'''

这类似于使用 setattrib 设置属性:

setattr(class instance, attribute, value)

其中属性可以在变量中定义。

如果存在如何访问这些名称的问题,它们将在另一个类中定义,然后可以检查整个 dom。

有没有办法做到这一点?

一个例子是狗的 XML 文件,包括狗名、品种、生日等元素。每只狗将是我的初始 dom 类下的一个超节点类,所有属性“神奇地”设置在每个超节点实例中

4

1 回答 1

1

我终于想到了我需要做的事情,可悲的是,答案已经在上面了(有点谦虚总是好的)。包装对象时,只需使用setattr,如下所示:

>>> class SuperClass():
...     def print_hello(self):
...         print('Hello, world!')

>>> class WrapperClass():
...     pass

>>> wrapper = WrapperClass()
>>> setattr(wrapper, 'clarence', SuperClass())

>>> wrapper.clarence.print_hello()
Hello, world!
>>> 

实际上,我将在 wrapper-type 类中使用代码,因此它将是:

setattr(self, 'clarence', SuperClass())

如果要在全局范围内执行此操作,请使用 globals() 分配值,如下所示:

>>> globals()['clarence'] = SuperClass()
>>> clarence.print_hello()
Hello, world!
于 2013-01-28T20:19:45.813 回答