1

nodeName未知のdomsで未知のものからクラスをインスタンス化する方法を取得しようとしています(を使用せずにeval())。

nodea が adom nodeにあると仮定して、この疑似コードのようなことをしたい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 ファイルがあります。各犬は、SuperNode の各インスタンスにすべての属性が「魔法のように」設定された、最初の dom クラスの下にある superNode のクラスになります。

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!
>>> 

実際には、ラッパー型クラス内でコードを使用するので、次のようになります。

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

グローバル スコープで実行する場合は、globals() を使用して次のように値を割り当てます。

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