我希望课程能够在某个特定事件上调用我的函数。我的问题是,检查“无”以检查函数“指针”是否已初始化是一种好习惯吗?还有其他陷阱使用这种模式吗?
课堂上:
class Consumer(object):
_functionCallBack = None
def __init__(self, hostName):
self._hostName = hostName
def SetCallBack(self, funcCallback):
self._functionCallBack = funcCallback
def HandleMessage(self, body):
print(" [x] Received %r" % body)
if self._functionCallBack is not None:
self._functionCallBack(body)
在调用代码时:
def handleMessageReceived(message):
print("In call back", message);
def main():
Consumer = Consumer("hostname")
consumer.SetCallBack(handleMessageReceived)
consumer.Start()
if __name__ == "__main__" : main()
我无法找到任何最佳做法 - 如果Python文档中有一些可以让我知道。
答案 0 :(得分:1)
您通常应该使用if ...不是None:构造来检测未初始化的变量。一个选项是使用try / catch子句,但是你的情况不是意外的备用流,可以避免try / catch。
另见:How to test whether a variable has been initialized before using it?
答案 1 :(得分:1)
这里的解决方案(来自设计POV)将使用NullObject模式 - 在这种情况下,使默认functionCallback
成为无操作模式,这样您就不必测试任何东西。此外,您可能希望在实例时传递回调而不是稍后添加(除非在您的实际代码中,您需要在当前的不同阶段执行此操作)
def noop(message):
pass
class Consumer(object):
def __init__(self, hostname, callback=noop):
self._hostname = hostname
self._callback = callback
def set_callback(self, callback):
self._callback = callback
def handle_message(self, body):
logger.info(" [x] Received %r", body)
self._callback(body)
现在,这是否比针对None
的测试更好,还有待读者的赞赏。专业人士:你没有特殊情况,缺点:你有一个可能没用的函数调用。如果您期望Consumer
个实例在大多数情况下获得有效回调,那么" no-op回调"解决方案可能会稍微清洁,否则"检查无"完全有效。