如何有效地改变类实现

时间:2012-10-24 12:35:38

标签: python

我想根据构造函数参数更改实现。下面是一个显示我的意思的例子:

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

为什么不应该这样做或者我不知道的其他缺点有任何缺点吗?这真的更快吗?(我知道继承是另一种选择)

2 个答案:

答案 0 :(得分:2)

我想建议Replace Conditional with Polymorphism重构,因为它比当前代码和建议的替代方案更优雅地解决了您的问题:

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

class SimulatedDevice(object):
    def foo(self):
        # simulate foo

答案 1 :(得分:1)

你正在做的事情非常好,你会发现很多Python框架中使用的技术。但是,您可能希望使用timeit来检查这是否真的更快。

当您访问instance.foo时,Python将首先在类定义中查找它以确保它不是数据描述符(例如属性),然后在实例命名空间中查找它,但这是一个非常快速的查找,因为foo未在类中定义(设置self.foo将其存储在实例__dict__命名空间中)。

if语句几乎肯定而不是双重查找,因为if语句本身需要以相同的方式查找self.simulate,但是差异可以忽略不计。