![](/img/trans.png)
[英]traceback behaviour for __init__ errors when using __call__ in metaclasses?
[英]When is using __call__ a good idea?
人们对使用__call__
的看法是什么。 我只是很少看到它使用,但我认为当你知道一个类将被用于某些默认行为时,它是一个非常方便的工具。
我认为你的直觉是正确的。
从历史上看,OO世界中使用了可调用对象(或者我有时称之为“仿函数”的对象)来模拟闭包。 在C ++中,它们经常是不可或缺的。
但是, __call__
在Python世界中有相当多的竞争:
我会说使用__call__
的时间是因为上面的一个选项没有给你更好的服务。 或许,请检查以下标准:
run()
或doStuff()
或go()
或者流行且永远冗余的doRun()
,您可能会有候选人。 我喜欢的一个例子是UI命令对象。 设计的目的是让他们的主要任务是执行comnand,但是使用额外的方法来控制他们的显示作为菜单项,例如,在我看来,这仍然是你仍然想要一个可调用对象的东西。
如果您需要对象可以调用,请使用它,这就是它的用途
我不确定你的默认行为是什么意思
我发现它特别有用的一个地方是使用包装器或某些框架/库内深度调用对象的地方。
更一般地说,Python有很多双下划线方法。 它们存在的原因是:它们是重载运算符的Python方式。 例如,如果你想要一个新的类,我不知道,打印"foo"
,你可以定义__add__
和__radd__
方法。 关于这一点没有任何本质上的好或坏,除了使用for
循环有任何好处或坏处之外。
事实上,使用__call__
通常是更多Pythonic方法,因为它鼓励代码清晰。 你可以取代MyCalculator.calculateValues( foo )
与MyCalculator( foo )
,说。
它通常在类被用作具有某些实例上下文的函数时使用,例如一些将用作@DecoratorClass('some param')
DecoratorClass,因此'some param'将存储在实例的命名空间中,然后实例被称为实际装饰。
当你的类提供一些不同的方法时它并不是很有用,因为它通常不明显调用会做什么,而在这些情况下,显式优于隐式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.