2

私のプロジェクトでは、コードのそのような部分を頻繁に繰り返さなければなりません:

class SimplePhysicObject(Object):
    def __init__(self):
        super(Object, self).__init__('SimplePhysicObject')

しかし、代わりにSimplePhysicObject毎回新しい文字列があります。この作業を簡単にするマクロを書く方法はありますか? 何かのようなもの:

DoTemplate(NewObject)
==>
class NewObject(Object):
    def __init__(self):
        super(Object, self).__init__('NewObject')

UPD申し訳ありませんが、Objectコードで以前に宣言された自分のクラスです

4

5 に答える 5

7

Objectパラメータとして実際のクラス名が必要な理由がわかりません。で実際のクラス名にアクセスできObjectますself.__class__.__name__

class Object(object):
    def __init__(self):
        self.name = self.__class__.__name__

class SimplePhysicObject(Object):
    pass

a = SimplePhysicObject()
print a.name

印刷します

SimplePhysicObject

これは元のコードとは少し異なります。から派生した場合SimplePhysicObjectname属性は派生クラスの名前に設定されますが、元のコードは引き続きを使用します"SimplePhysicObject"

于 2012-07-26T18:30:22.360 に答える
3

の議論を得るのsuper(…).__init__は難しいことではありません。super手動で処理するのが最適な、それ自体への引数としてクラスオブジェクトを取得しています。

class SimplePhysicObject(Object):
    def __init__(self):
        cls = SimplePhysicObject
        super(cls, self).__init__(cls.__name__)
于 2012-07-26T18:22:54.013 に答える
1

別のアプローチとは対照的に、あなたが望むものに近いことをするには、次のようなものを使用できます。

CLASS_TEMPLATE = """
class {name}(object):
    def __init__(self):
        super({name}, self).__init__('{name}')
"""

def main():
    name = "SimplePhysicsObject"
    exec CLASS_TEMPLATE.format(name=name)
    print locals()[name]

if __name__ == '__main__':
    main()

これは Python 2.7 で有効です。(古いsuper()構文を使用しているように見えます。)Python 3.2を使用している場合は、collections.namedtupleクラスを動的に作成する実装を見て、新しいexec()関数の使用方法を確認できます。

重要な点は、これは実際にはマクロではなく、「コンパイラ」が処理する前にクラス定義に展開されないということです。それは新しいオブジェクトを返しtypeます。それが正しい名前空間に入るのを確認するのはあなた次第です。

于 2012-07-26T18:35:28.197 に答える
0

まさにそれを行うことができ、DoTemplate関数が新しいインスタンス化されたクラスを返すようにし、Objects 文字列からクラス名を取得でき__class__ます。

于 2012-07-26T18:22:41.077 に答える
0

MacroPy はあなたが探しているものだと思います: https://github.com/lihaoyi/macropy#case-classes

于 2013-05-13T20:10:47.760 に答える