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语句几乎肯定比双重查找慢,因为语句if本身需要以self.simulate相同的方式查找,但差异可以忽略不计。

于 2012-10-24T12:41:06.967 回答