5

「コンパイル」時に静的に決定できる動的なクラス生成を行っています。私が今持っている単純なケースは、多かれ少なかれ次のようになります。

class Base(object):
    def __init__(self, **kwargs):
        self.do_something()

def ClassFactory(*args):
    some_pre_processing()
    class GenericChild(Base):
        def __init__(self, **kwargs):
            self.some_processing()
            super(GenericChild, self).__init__(*args, **kwargs)
    return GenericChild

Child1 = ClassFactory(1, 'Child_setting_value1')
Child2 = ClassFactory(2, 'Child_setting_value2')
Child3 = ClassFactory(3, 'Child_setting_value3')

インポート時に、Pythonインタープリターはバイトコードにコンパイルされ、Pythonインスタンスごとに1回ファイルを実行するように見えます(したがってChild1、、、Child2およびを生成します)。Child3

Pythonにファイルをコンパイルし、それを1回実行してChildクラスを解凍し、それをpycファイルにコンパイルして、解凍が1回だけ(Pythonスクリプトの連続実行間でも)行われるようにする方法はありますか?

他にももっと複雑で拡張性のあるユースケースがあるので、クラスを手書きしてファクトリを単純に取り除くことChildは実際にはオプションではありません。また、可能であれば、余分なプリプロセッサの手順を避けたいと思います(CスタイルのマクロをCプリプロセッサで使用するなど)。

4

2 に答える 2

1

いいえ、代わりにPythonコードを生成する必要があります。代わりに、これらのクラスがPythonコードに「ベイク」されます。

Pythonソースコードを生成し、それらを.pyファイルに保存してから、それらをバイトコンパイルする場所で、何らかの形式の文字列テンプレートを使用します。

ただし、クラスの生成は起動時に1回だけ行われます。これらを生成するのは本当に大きなコストですか?

于 2013-03-05T22:21:24.037 に答える
0

子クラスを分離する必要がなく、特定のオブジェクトセットの「標準構成」が必要な場合は、ObjectFactoryをそこに格納されている構成を持つクラスにすることができます。各インスタンスは、適切な構成でGenericChildrenを吐き出すことができ、クラスの実行時生成(およびそれに関連するデバッグの問題)を完全に回避します。

于 2013-03-05T22:59:26.520 に答える