0

コンストラクタの引数によって実装を変えたい。以下は、私が意味することを示す例です。

class Device(object):
    def __init__(self, simulate):
        self.simulate = simulate

    def foo(self):
        if simulate:
            self._simulate_foo()
        else:
            self._do_foo()

    def _do_foo(self):
        # do foo

    def _simulate_foo(self):
        # simulate foo

foo()これで、 を呼び出すたびにif句が呼び出されます。それを避けるために、正しいメソッドを に動的にバインドできますfoo

class Device(object):
    def __init__(self, simulate):
        if simulate:
            self.foo = self._simulate_foo
        else:
            self.foo = self._do_foo()

    def _do_foo(self):
        # do foo

    def _simulate_foo(self):
        # simulate foo

これを行うべきでない理由や、私が気付いていないその他の欠点はありますか? これは本当に速いですか?(継承が別のオプションであることは承知しています)

4

2 に答える 2

2

現在のコードと提案された代替案の両方よりも洗練された方法で問題を解決するため、代わりに条件付き置換とポリモーフィズムリファクタリングを提案したいと思います。

class Device(object):
    def foo(self):
        # do foo

class SimulatedDevice(object):
    def foo(self):
        # simulate foo
于 2012-10-24T13:00:12.097 に答える
1

あなたがしていることはまったく問題なく、多くの Python フレームワークで使用されているテクニックを見つけることができます。timeitただし、これが本当に速いかどうかを確認するために使用したい場合があります。

にアクセスするinstance.fooと、Python は最初にクラス定義でそれを検索してデータ記述子 (プロパティなど) でないことを確認し、次にインスタンスの名前空間で検索しますが、fooは で定義されていないため、検索は非常に高速です。クラス (設定self.fooはそれをインスタンス__dict__名前空間に保存します)。

ステートメント自体は同じ方法でルックアップする必要があるため、ステートメントはそのダブル ルックアップよりもifほぼ確実に遅くなりますが、違いはごくわずかです。ifself.simulate

于 2012-10-24T12:41:06.967 に答える