0

カスタム クラスのディクショナリを保持して、(db からロードされた) 他のディクショナリから動的にインスタンス化できるようにしたいのですが、何を保存すればよいかわかりません。

class_register = {}

class Foo(object):
    def __init__(self, **kwargs):
        class_register[self.__class__.__name__] = ??  # what to store here?
        self.__dict__.update(kwargs)

new_instance = class_register[result['class_name']](**result['data'])

どんな提案にもオープンです。

4

2 に答える 2

2

__subclasses__()それらがすべて完了したことを確認したら、同じ基本クラスからそれらを継承し、そのクラスを要求します。おそらく次の形式で:

 Base.class_register = dict((x.__name__, x) for x in Base.__subclasses__())

Python に簿記を行わせるために使用する魔法は少なくなります。

また、このスーパークラスが保証されているように見えるほど十分な共通点がない場合、構築後に同じコードでそれらを混乱させない方法で使用するのにおそらく問題が生じるでしょう。

于 2014-09-01T22:44:14.840 に答える
2

クラス自体を保存するだけです:

class_register[self.__class__.__name__] = self.__class__

ただし、クラスをインスタンス化するたびにクラスを登録しているため、これは少しやり過ぎです。

これを使用することをお勧めします:

def register(cls):
    class_register[cls.__name__] = cls

class Foo(object):
    # blah blah

register(Foo)

そして、これをクラス デコレータに変換して、次のように使用できます。

def register(cls):
    class_register[cls.__name__] = cls
    return cls

@register
class Foo(object):
    # blah blah
于 2012-12-24T04:51:41.500 に答える