在 python 中使对象可调用的问题

2024-02-02

我写了这样的代码

>>> class a(object):
        def __init__(self):
            self.__call__ = lambda x:x

>>> b = a()

我期望类的对象a应该是可调用对象,但显然不是,我不明白为什么。

>>> b()

Traceback (most recent call last):
    File "<pyshell#5>", line 1, in <module>
        b()
TypeError: 'a' object is not callable
>>> callable(b)
False

>>> hasattr(b,'__call__')
True

特殊方法可在type正在操作的对象的(例如,类),而不是特定的实例。想一想:否则,如果一个类定义了__call__例如,当该类被称为__call__应该被称为...真是一场灾难!但幸运的是,特殊方法是在类的类型(又名元类)上查找,一切都很好(“遗留类”在这方面有非常不规则的行为,这就是为什么我们使用新型类会更好 -这是 Python 3 中仅存的)。

因此,如果您需要“按实例重写”特殊方法,则必须确保该实例具有其自己的唯一类。这很简单:

class a(object):
    def __init__(self):
        self.__class__ = type(self.__class__.__name__, (self.__class__,), {})
        self.__class__.__call__ = lambda x:x

你就在那里。当然,在这种情况下这是愚蠢的,因为每个实例最终都只有相同的“所谓的每个实例”(!)__call__,但如果您确实需要在每个实例的基础上进行覆盖,那么它会很有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 python 中使对象可调用的问题 的相关文章

随机推荐

  • 有可用的 ccTalk 库吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想将硬币接收器集成到我们的一个应用程序中 这个特定的硬币接收器使用ccTalk协议 http en
  • Firebase Blaze 计划和云功能

    不幸的是 Firebase 的 Flame 计划消失了 我现在必须处理 Blaze 计划 我不喜欢它 因为它的预算 无限 但我的钱包不是 昨天 我在编码时错误地创建了一个名为 3 Cloud Functions 的循环 我发现该循环的速度足
  • Visual Studio 意外停止调试且没有错误

    我正在调试一个项目 Visual Studio 停止调试并在以下行关闭程序 没有异常或错误消息 我已启用选项中任何引发的异常的通知 var query Session Linq
  • 使用 Maven 进行集成测试:在测试之前运行 jar,并在测试之后终止

    我有一个可运行的 jar 我想在集成测试开始之前在新进程中运行 在pre integration test 并在我的集成测试完成后终止它 在post integration test 我可以使用的东西之一是maven antrun 插件 h
  • 自定义 @font-face 无法在 chrome 中加载(chrome 自定义字体不渲染)

    custom font face无法在 chrome 中加载 chrome 自定义字体不渲染 使用 CSS 使用自定义字体 font face font family gotham rounded medium src url fonts
  • 如何在 fstream 文件之间切换而不关闭它们(同时输出文件) - C++

    我有一个 C 的小问题 无法通过在线浏览解决 这是我的代码 摘录 if File is open while File eof i getline File Line if i gt 2 Skip Headers int CharCount
  • 确定一个矩形是否被另一组矩形完全覆盖所需的算法

    我正在寻找一种算法来确定新矩形是否被一组现有矩形完全覆盖 问题的另一种方式是 新矩形是否完全存在于现有矩形覆盖的区域中 似乎有很多算法可以确定矩形重叠等 但我找不到任何可以解决这个确切问题的算法 矩形将使用 x y 坐标表示 这个问题与地理
  • 单元测试WCF方法

    我创建了一个 WCF 服务并尝试测试其中一种方法 我右键单击 WCF 服务方法并选择创建单元测试 它创建了一个新的测试项目并创建了一个单元测试 我尝试运行测试项目 但我不确定应该是什么UrlToTest价值 我已将 url 放入该服务 Te
  • python从具有相同方法名称的不同路径进行多重继承

    通过以下代码示例 可以super被使用 或者C必须打电话A foo and B foo明确地 class A object def foo self print A foo class B object def foo self print
  • 从午夜开始的日期时间到毫秒

    我怎样才能转换time给定的一部分DATETIME自午夜以来的毫秒数 例如 2011 08 29 00 00 00 gt 0 2011 08 28 00 00 00 gt 0 2011 08 29 01 00 00 gt 3600000 在
  • 我的 Eclipse 可以编译,但找不到 JDK!

    我不久前在 Windows 机器上安装了 Eclipse 几天前 我正在做一些 Java 编码 我注意到我没有 JDK 但 Eclipse 仍然可以编译和运行 Java 类 它包含编译器吗 是的 Eclipse 包含它自己的增量编译器 增量
  • 如何从 Express 路由中的 URL 获取可选语言参数?

    我陷入了一个愚蠢的问题 如何与optional区域设置参数 那就是我的意思 例如 我有首页 and contacts 这是路线 app get frontpage get app get contacts contacts get 现在我正
  • 使用 UNION 子句进行 SELECT

    例如 我有这两张桌子 DEPARTMENT DNAME CITY RESEARCH BOSTON IT CITY SCIENCE DALLAS RESEARCH DALLAS 所以我用这个声明 SELECT DNAME FROM DEPAR
  • 如何使 BoxLayout 表现得像垂直 FlowLayout?

    FlowLayout从右侧执行 压力 因此所有组件都试图采用其最小宽度 相反 BoxLayout尝试分散所有组件以填充空间的整个高度 我可以添加一些填充物作为最后一个组件还是使所有组件的高度最小BoxLayout 您可以使用 Box cre
  • 当在下拉列表中选择值时,MVC 使用 ajax 发布值

    我的表单中有几个下拉列表 每次用户在这些下拉列表之一中选择一个值时 我是否希望将该值保存到后端 数据库 我不想重新加载页面 所以我想实现这一点的最佳方法是使用ajax 这就是我需要的帮助 当我在下拉列表中选择一个值时 如何让它自动将值发布到
  • 如何在 Python 2 中发送 HEAD HTTP 请求?

    我在这里尝试做的是获取给定 URL 的标头 以便确定 MIME 类型 我想看看是否http somedomain foo 例如 将返回 HTML 文档或 JPEG 图像 因此 我需要弄清楚如何发送 HEAD 请求 以便我可以读取 MIME
  • 从cmd命令中获取字符串?进程.StartInfo

    所以我尝试过 Process 并启动 cmd exe 并将命令直接发送到该窗口 然后获取写入 cmd exe 窗口的值 代码如下所示 Dim arrServers As ArrayList Dim s ListBoxServers Item
  • 通过 ssh 将脚本和二进制数据传输到 stdin

    我想远程执行一个 bash 脚本 该脚本使用 tarball 并对其执行一些逻辑 诀窍是我只想使用一个 ssh 命令来完成此操作 而不是scp对于 tarball 然后是ssh对于脚本 bash 脚本如下所示 cd tmp tar zx a
  • 过滤唯一值并对 A 到 Z 进行排序 Excel VBA

    我一直在使用下面的代码来过滤唯一值Sheet1并将它们粘贴到Sheet2我的代码工作正常 但它有一个问题 当我从 Sheet1 Range C4 C 单元格中删除任何值时 它会给出空单元格Sheet2就像下面的图片一样 我希望如果我从 Sh
  • 在 python 中使对象可调用的问题

    我写了这样的代码 gt gt gt class a object def init self self call lambda x x gt gt gt b a 我期望类的对象a应该是可调用对象 但显然不是 我不明白为什么 gt gt gt