什么时候使用__call__好主意?

Tim*_*ara 17 python oop

什么是人民的使用意见__call__.我只是很少看到它使用,但我认为当你知道一个类将被用于某些默认行为时,它是一个非常方便的工具.

Owe*_* S. 19

我认为你的直觉是正确的.

从历史上看,OO世界中使用了可调用对象(或者我有时称之为"仿函数"的对象)来模拟闭包.在C++中,它们经常是不可或缺的.

但是,__call__在Python世界中有相当多的竞争:

  • 一种常规命名方法,其行为有时可以更容易地从名称中推断出来.可以转换为绑定方法,可以像函数一样调用.
  • 一个闭包,通过返回嵌套块中定义的函数获得.
  • 一种lambda,这是一种有限但快速的封闭方式.
  • 生成器和协同程序,其身体保持积累状态就像仿函数一样.

我要说的是,使用时间__call__是指上述其中一个选项不能提供更好的服务.或许,请检查以下标准:

  • 你的对象有状态.
  • 你的班级有明确的"主要"行为,这有点愚蠢.例如,如果你发现自己正在写作,run()或者doStuff()或者go()或者是流行且永远多余的doRun(),你可能会有一个候选人.
  • 您的对象的状态超出了生成器函数的预期.
  • 您的对象包装,模拟或抽象函数的概念.
  • 您的对象具有其他辅助方法,这些方法在概念上属于您的主要行为.

我喜欢的一个例子是UI命令对象.设计的目的是让他们的主要任务是执行comnand,但是使用额外的方法来控制他们的显示作为菜单项,例如,在我看来,这仍然是你仍然想要一个可调用对象的东西.