Python函数;指针";:检查无
我想要一个类在某个事件上调用我的函数。我的问题是,检查函数“指针”是否已初始化,检查“无”是否为良好做法?是否有其他使用此模式的陷阱 课堂上:Python函数;指针";:检查无,python,function-pointers,Python,Function Pointers,我想要一个类在某个事件上调用我的函数。我的问题是,检查函数“指针”是否已初始化,检查“无”是否为良好做法?是否有其他使用此模式的陷阱 课堂上: class Consumer(object): _functionCallBack = None def __init__(self, hostName): self._hostName = hostName def SetCallBack(self, funcCallback): self._
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文档中有一些,您能告诉我吗。您通常应该使用if。。。不是无:用于检测未初始化变量的构造。一种选择是使用try/catch子句,但您的情况不是意外的备用流,可以避免try/catch
另请参见:您通常应该使用if。。。不是无:用于检测未初始化变量的构造。一种选择是使用try/catch子句,但您的情况不是意外的备用流,可以避免try/catch 另请参见:这里的一个解决方案(来自设计POV)是使用NullObject模式-在这种情况下,将默认的
函数回调
设置为无操作函数,这样就不必测试任何东西。此外,您可能希望在实例化时传递回调,而不是稍后添加回调(除非在实际代码中,您需要在不同的阶段这样做)
现在,这是否比针对None
进行测试更好,留给读者欣赏。优点:你没有特殊情况,缺点:你有一个可能无用的func调用。如果您希望消费者实例在大多数情况下得到有效的回调,“无操作回调”解决方案可能会稍微干净一些,否则“无检查”是完全有效的。这里有一个解决方案(来自设计POV)将使用NullObject模式—在本例中,将默认的functionCallback
设为无操作函数,这样就不必测试任何内容。此外,您可能希望在实例化时传递回调,而不是稍后添加回调(除非在实际代码中,您需要在不同的阶段这样做)
现在,这是否比针对
None
进行测试更好,留给读者欣赏。优点:你没有特殊情况,缺点:你有一个可能无用的func调用。如果您希望使用者
实例在大多数情况下都能得到有效的回调,“无操作回调”解决方案可能会稍微干净一些,否则“检查无”是完全有效的。不应该\u functionCallBack=None
成为\u init\u
方法的一部分吗?旁注:您需要在每个更改其值的函数中声明全局函数callback
。@barakmanos-即使它在类中,并且您正在使用self访问它?@barakmanos-实际上,我在第一篇文章中没有自我更新现在我不知道,我看到了一个全局变量。无self
,且不在类内。好的,如果你想在函数中改变它,然后您需要在该函数中声明它global
。不应该\u functionCallBack=None
成为\u init\u
方法的一部分吗?旁注:您需要在每个更改其值的函数中声明global\u functionCallBack
。@barakmanos-即使它在类中并且您正在使用self访问它它?@barakmanos-事实上,我在第一篇文章中没有自我更新-现在我不知道,我看到一个全局变量在那里。无self
,且不在类内。好的,如果您想在函数中更改它,那么您需要在该函数中声明它global
。
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)