使用元类理解 __call__ [重复]

2023-11-27

据我了解__call__类中的方法实现了函数调用运算符,例如:

class Foo:
    def __init__(self):
        print("I'm inside the __init__ method")

    def __call__(self):
        print("I'm inside the __call__ method")

x = Foo() #outputs "I'm inside the __init__ method"
x() #outputs "I'm inside the __call__ method"

然而,我正在经历Python 食谱并且作者定义了一个元类来控制实例创建,这样你就不能直接实例化对象。他是这样做的:

class NoInstance(type):
    def __call__(self, *args, **kwargs):
        raise TypeError("Can't instantaite class directly")


class Spam(metaclass=NoInstance):
    @staticmethod
    def grok(x):
        print("Spam.grok")

Spam.grok(42) #outputs "Spam.grok"

s = Spam() #outputs TypeError: Can't instantaite class directly

然而,我不明白的是如何s()没有被调用,但它是__call__方法被调用。这是如何运作的?


元类实现类(而不是实例)的行为方式。因此,当您查看实例创建时:

x = Foo()

这实际上是“调用”该类Foo。这就是为什么__call__元类的调用之前__new__ and __init__类的方法初始化实例。


正如 @Take_Care_ 在评论中指出的,元类的一项重要资源是ionelmc 的博客文章关于“理解Python元类”。该博文中的一张图片直接适用于您的情况:

enter image description here

图片是直接从博文中复制过来的。

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

使用元类理解 __call__ [重复] 的相关文章

随机推荐

  • 将广播接收器包装到 Flow(协程)中

    我有一个用于 wifi 扫描结果的广播接收器作为数据源 我想以协程方式制作它 我在这里找到了暂停功能的答案 https stackoverflow com a 53520496 5938671 suspend fun getCurrentS
  • 没有行开始和结束终止符的 Regex.Replace 会产生一些非常奇怪的效果......这里发生了什么?

    在回答这个问题的时候C 正则表达式 替换 和 有人提出了问题为何存在的问题 玩的时候我生成了以下代码 string s Regex Replace A w B Console Write s 这有输出 B BB B 我发现 0 长度的字符串
  • 对结构进行索引合法吗?

    无论代码有多 糟糕 并假设对齐等在编译器 平台上不是问题 这是否是未定义或损坏的行为 如果我有这样的结构 struct data int a b c struct data thing Is it legal访问a b and c as t
  • 使用外键链接保存模型表单时,Django“ManagementForm 数据丢失或已被篡改”

    我对 Django 相当陌生 所以这可能是一个简单的问题 我有 2 个 modelForms 其中有另一个 modelForms 的外键 我的主要目标是保存带有疾病 FK 链接的指标 这样对于特定疾病 您可以有多个指标 使用下面的代码 当我
  • 使用 hibernate jpa 进行 JSON 序列化和反序列化,以便在 JSON 响应中将父对象转换为子对象

    我正在使用 Spring 框架 Hibernate 和 JSON 开发 Rest Web 应用程序 请假设我有两个实体 如下所示 基础实体 java MappedSuperclass JsonIdentityInfo generator O
  • 为什么 regex_match 会抛出“复杂性异常”?

    我正在尝试测试 使用boost regex 文件中的行是否仅包含由空格分隔的数字条目 我遇到了一个我不明白的异常 见下文 如果有人能解释为什么会抛出它 那就太好了 也许我在定义模式时做了一些愚蠢的事情 这是代码 regex test cpp
  • 异步分派递归块

    假设我运行这段代码 block int step 0 block dispatch block t myBlock myBlock if step STEPS COUNT return step dispatch time t delay
  • Java 中的排出标准错误

    从 Java 启动进程时 如果我不从管道读取数据 stderr 和 stdout 都会阻塞输出 目前 我有一个线程主动从一个线程读取数据 而主线程则在另一个线程上阻塞 有没有一种简单的方法来连接两个流或以其他方式导致子进程继续 同时不丢失
  • delegate.Invoke 如何工作?

    如果我在代码中创建一个委托 例如 delegate void dostuff string o 这会生成一个派生自的类System MulticastDelegate它实现了三种方法 Invoke BeginInvoke and EndIn
  • jQuery:当“dblclick”即将发生时抑制“click”?

    假设我有一个 span 当您单击此跨度时 我想要一个save 功能来开火 当您双击跨度时 我想要一个rename 功能来开火 但是 如果双击跨度 首先click事件将会触发 然后dblclick事件 自从click先于dblclick 我怎
  • Flutter 中的 VoidCallback 是如何工作的?

    我从互联网上了解到的信息是无效回调 是不带参数也不返回任何参数的函数 以下代码来自应用程序 并且该应用程序运行良好 我想问一下使用 VoidCallback 作为type而不是作为function 我是 Flutter 开发的绝对初学者 请
  • _int64 没有命名类型

    In my pch文件我有以下定义 if MSC VER lt 1300 typedef signed char int8 t typedef signed short int16 t typedef signed int int32 t
  • 如何使用javascript调用按钮点击事件背后的代码

    是否可以使用 javascript 或 jquery 调用服务器端按钮单击事件 如果是的话该怎么做 假设这是你的 html
  • 检查浏览器通知是否可用

    我正在处理浏览器通知 因为它不适用于我想签入的每个浏览器JS code 如果可用的话 我查看了 Mozilla 开发者部分 https developer mozilla org en US docs Web API Notificatio
  • JQuery 多个选择器,$(this) 引用?

    鉴于以下 identifier div first idetifier2 fadeOut 300 function I need to reference just the identifier div first element howe
  • 递归计算 DataFrame 值

    我正在尝试 递归 计算 pandas 数据框的列值 假设有两个不同日期的数据 每个日期有 10 个观测值 并且您想要计算某个变量 r 其中仅给出 r 的第一个值 每天 并且您想要计算剩余的 2 9 条目 而每个后续值取决于在 r 的前一个条
  • 如何按第一维对张量进行排序

    我有一个 2D 张量 我想按第一个维度排序 如下例所示 a torch FloatTensor 5 5 5 3 3 5 6 4 3 7 我预计排序后的结果是这样的 a torch FloatTensor 3 5 3 7 5 3 5 5 6
  • 尝试对 var/www/html 使用符号链接

    这就是我想要实现的目标 从中创建符号链接var www html到主目录中的目录 文件夹 我试图在 home 中符号链接到的目录 是一个 git 存储库 如果这有什么区别的话 我在这个目录中有一个index html 文件 我使用以下命令在
  • 如何在 MySQL 中插入大量行?

    例如 如何使用单个查询将 100 000 行插入 MySQL 表中 insert into table values 1 a b 2 c d 3 e f 这将执行 3 行的插入 根据需要继续达到 100 000 在进行 ETL 工作时 我会
  • 使用元类理解 __call__ [重复]

    这个问题在这里已经有答案了 据我了解 call 类中的方法实现了函数调用运算符 例如 class Foo def init self print I m inside the init method def call self print