当前位置: 首页 > 面试题库 >

为什么不向实例工作中动态添加__call__方法?

邹铭
2023-03-14
问题内容

在Python 2和Python 3中,代码:

class Foo(object):
    pass

f = Foo()
f.__call__ = lambda *args : args

f(1, 2, 3)

作为错误返回Foo object is not callable。为什么会这样呢?

PS:对于旧类,它可以按预期工作。

PPS:此行为是有意的(请参阅接受的答案)。作为一种变通办法,可以定义一个__call__类级别,该类级别仅转发给另一个成员,并将此“普通”成员设置为每个实例的__call__实现。


问题答案:

双下划线方法总是在类上查找,而不是实例上。请参阅
特殊方法查找新类

对于新型类,只有在对对象的类型(而不是在对象的实例字典中)进行定义的情况下,才能保证对特殊方法的隐式调用可以正常工作。

这是因为 类型 可能需要支持相同的操作(在这种情况下,将在元类型上查找特殊方法)。

例如,类是可调用的(这就是您生成实例的方式),但是如果Python 在实际对象上
查找__call__方法,那么您将永远无法在为其实例实现的类上这样做。会变成失败的原因,因为未将参数传递给未绑定的方法。因此,改为使用,并将调用转换为。
____call__``ClassObject()``ClassObject.__call__()``self``type(ClassObject).__call__(ClassObject)``instance()``type(instance).__call__(instance)

要解决此问题,您可以__call__在类中添加一个方法来检查类中的__call__属性,如果存在,则对其进行调用。



 类似资料:
  • 问题内容: 每当您尝试调用对象时,都会调用Python的magic方法。因此等于。 函数是Python中的一类对象,这意味着它们只是可调用的对象(使用)。但是,它本身是一个函数,因此它也具有,又具有自己的功能,又具有自己的功能。 因此,因此等于并再次等于等,依此类推。 这个无限循环如何结束?实际如何执行代码? 问题答案: 在幕后,Python中的所有调用都使用相同的机制,并且几乎所有调用都在CPy

  • Test类是超级类,Fest是它的子类,因为我们知道静态方法不能被重写,即使我遇到了“静态方法不能在java中隐藏实例方法”这样的错误,有人能解释一下吗,提前谢谢。

  • 我试图在CDI注入的帮助下实现某种“插件特性”。但我遇到了一些麻烦,我想我可能会从我的同事“堆垛工”那里得到一些外部的观点:-) 到目前为止,我已经做到了这一点: 当我“运行”这个时,两个字段都会被注入相应的实例。但当我尝试像这样更“动态”地注入它们时: 然后我会得到这样一个例外: 这对我来说似乎很奇怪,因为CDI显然“知道”我感兴趣的实例,因为直接注入类型化字段是有效的。所以我想这一定和资格赛有

  • 编译器在第3行给出了一个错误 此实例方法无法重写Abc中的静态方法 为什么静态方法不能被实例方法覆盖?

  • 问题内容: 在示例中,我试图将表添加到GUI中,然后向其中动态添加行(以显示进度)。我不明白的是为什么所有行一次出现。我的意思是,桌子在变,不是吗?有人可以给我一个解释吗? 问题答案: 正如kleopatra和peeskillet所指出的那样,我最初的例子遇到了一个愚蠢的错误。值得注意的是,我和佩斯基利特遵循的是不同的方法。在我的示例中,这些列旨在表示(可能或多或少)可能花费未知时间并且实际上可能

  • 我创建了一个简单的GUI,其中包括一个JTable。这张桌子可能被保存了 此时,保存函数按预期工作,当在保存目录中查找时,我可以看到表对象存储在文件中。 但是,当我尝试从文件加载表时,GUI从不显示加载的表。调用actionlistener函数,因为我有一个系统。输出“数据已加载”,但表格从不显示更新的数据。 我已尝试调用repaint(),但无效。如果有人能让我知道我可能做错了什么,我将不胜感激