我想根据构造函数参数更改实现。下面是一个显示我的意思的例子:
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
为什么不应该这样做或者我不知道的其他缺点有任何缺点吗?这真的更快吗?(我知道继承是另一种选择)
答案 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
,但是差异可以忽略不计。