3

私は何かのクラスを書いていますが、建設をタイプするのと同じ面倒なことに出くわし続けています。コンストラクターのすべてのパラメーターが独自の名前として初期化されるようにクラスを設定できる簡単な方法はありますfish = 0 -> self.fish = fishか?

class Example(object):
    def __init__(self, fish=0, birds=0, sheep=0):
        self.fish = fish
        self.birds = birds
        self.sheep = sheep
4

3 に答える 3

3

モジュールを使用できinspectます:

import inspect

class Example(object):

    def __init__(self, fish=0, birds=0, sheep=0):
        frame = inspect.currentframe()
        args, _, _, values = inspect.getargvalues(frame)
        for i in args:
            setattr(self, i, values[i])

これは機能しますが、手動で設定するよりも複雑です。これをデコレータで隠すことができるはずです:

@set_attributes
def __init__(self, fish=0, birds=0, sheep=0):
    pass

しかし、デコレーターが別のスタック フレームをミックスに挿入するため、定義set_attributesが難しくなり、詳細を正確に把握することができません。

于 2013-10-20T13:56:30.420 に答える
3

短い答え:いいえ。コンストラクターですべてを初期化する必要はありません (遅延して実行できます)。ただし、すぐに必要とするか、公開する (つまり、アクセスを制御しない) 場合を除きます。しかし、Python ではデータ フィールドを宣言しないため、それらがコードの別の部分に現れると、すべてを追跡するのが非常に難しくなります。

より包括的な答え: **kwargs(引数の名前と値のペアの辞書を保持する) を使用していくつかの魔法を行うこともできますが、変更を文書化することがほとんど不可能になり、ユーザーが特定の引数が受け入れられるかどうかを確認することが難しくなるため、これは非常にお勧めできません。いいえ。オプションの内部フラグにのみ使用してください。渡すパラメーターが 20 個以上ある場合に役立つ可能性がありますが、その場合は、設計とクラスター データを再考することをお勧めします。

単純なキー/値ストレージが必要な場合は、 などのビルトインの使用を検討してdictください。

于 2013-10-20T13:34:06.907 に答える