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)