为什么 python 的 __init__ 函数没有 return 语句,即使它是一个函数

2024-06-26

这可能是一个愚蠢的问题,但我很想知道答案。 根据官方文件,__init__不需要return语句。有什么特殊原因会这样吗?

>>> class Complex:
...     def __init__(self, realpart, imagpart):
...         self.r = realpart
...         self.i = imagpart
...
>>> x = Complex(3.0, -4.5)

>>> x.r, x.i
(3.0, -4.5)

__init__()不是一个正常的函数。它是 Python 用于自定义类实例的特殊方法。它是一部分Python的数据模型 https://docs.python.org/2/reference/datamodel.html#object.__init__:

创建实例后调用(通过__new__()),但在返回给调用者之前[...]。

从上面可以看出,当你创建一个类的新实例时,Python 首先调用__new_()- 这也是一种特殊的方法 - 创建类的新实例。然后__init__()被调用来定制新实例。

从以下位置返回任何内容是没有意义的__init__(),因为类实例已经创建。事实上,Python 甚至引发了一个错误来防止这种情况发生:

>>> class A:
...     def __init__(self):
...         return 'foo'
... 
>>> A()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() should return None, not 'str'
>>> 

如果你想知道幕后到底发生了什么,@eryksun https://stackoverflow.com/users/205580/eryksun提供了一个很好的解释:

要完整地解释这个故事,你必须回到元类__call__方法。特别是默认的type.__call__ https://github.com/python/cpython/blob/e9f9b042781e3cb480315860bcdf7b7d22cba0f8/Objects/typeobject.c#L737在 CPython 调用中__new__ and __init__通过他们的C槽函数,它是slot_tp_init(定义于对象/typeobject.c https://github.com/python/cpython/blob/e9f9b042781e3cb480315860bcdf7b7d22cba0f8/Objects/typeobject.c#L5828) 强制返回值为 None。如果您使用覆盖的自定义元类type.__call__,它可以手动调用__new__ and __init__类的方法,不限制什么__init__可以回来——尽管这很愚蠢。

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

为什么 python 的 __init__ 函数没有 return 语句,即使它是一个函数 的相关文章

  • 使用不带引号的块样式的 Python YAML 转储

    如何使用 PyYAML 加载和转储 YAML 以便它尽可能地使用原始样式 我有 Python 来加载和转储 YAML 数据 例如 import sys import yaml def represent dictorder self dat
  • Django CollectStatic 启动大文件上传时管道损坏

    我正在尝试使用collectstatic将静态文件上传到我的S3存储桶 但我收到一个700k javascript文件的管道损坏错误 这就是错误 Copying Users wedonia work asociados server aso
  • 为什么Flask后台线程获取错误的数据库信息?

    为了将实时数据库信息推送到客户端 我在服务器端使用flask socketio 通过使用websocket将所有实时数据库信息推送到客户端 我的视图文件有一个片段 from models import Host from flask soc
  • python 函数 *args 和 **kwargs 以及其他指定的关键字参数

    我有一个 Python 类 它的方法应该以这种方式接受参数和关键字参数 class plot def init self x y self x x self y y def set axis self args xlabel x ylabe
  • 使用 Python 访问内存映射文件

    我希望利用激战 2 中的内存映射文件 该文件旨在链接到 Mumble 以获得位置音频 该文件包含有关字符坐标的信息和其他有用的信息 我已经能够使用此脚本访问坐标信息 import mmap import struct last while
  • 并行执行按位运算的代码

    我有这段代码 通过将该 AU 矩阵的每个字节 8 个元素打包到 A 中来减少内存消耗 从而使 100k 200k 矩阵占用更少的空间 正如您所期望的 这段代码需要永远运行 我也计划将行数增加到 200k 我正在一个非常强大的实例 CPU 和
  • 如何在 dash/plotly 中使用 iframe? (Python/HTML)

    我正在创建一个仪表板 我想使用这个交互式地图 网站链接 https www ons gov uk peoplepopulationandcommunity healthandsocialcare causesofdeath articles
  • 使用 pytherejs 嵌入小部件:错误的视角和相机观察

    我在用pythreejs可视化一些 3D 模型 在 Jupyter 笔记本上可视化模型时 一切都按预期进行 但是当尝试将小部件嵌入 HTML 文档时 我面临两个问题 看起来相机在加载时正在查看 0 0 0 而不是预期的那样 一旦您与小部件交
  • python osmnx - 仅提取一个国家的大型高速公路

    我知道可以通过 OSMNX python 包提取城市的道路网络 详情请参阅https geoffboeing com 2016 11 osmnx python street networks https geoffboeing com 20
  • python 函数中的对象不可迭代错误

    我有一个简单的功能如下 comdList range 0 27 for t in comdList print t 但是它返回一个 in object not iterable 错误 在函数之外它工作正常 这是怎么回事 尝试这个 for t
  • 如何在我的 GUI 上绘图

    我正在设计一个 GUIPyQt当我单击一个按钮来绘制我创建的函数的数据图时 我需要显示一个 matplotlib pylab 窗口 它就像 Matlab 中使用的运行时 每次按下该按钮时 我都想将 matplotlib pylab 窗口保留
  • 将列表列表替换为“压缩”列表列表,同时保持顺序

    我有一个列表列表 如我所附的代码所示 如果有任何共同值 我想链接每个子列表 然后我想用列表的精简列表替换列表的列表 例子 如果我有一个清单 1 2 3 3 4 I want 1 2 3 4 如果我有 4 3 1 2 3 I want 4 3
  • python请求ssl握手失败

    每次我尝试这样做 requests get https url 我收到这条消息 import requests gt gt gt requests get https reviews gethuman com companies Trace
  • 如何忽略 Sentry 捕获中的某些 Python 错误

    我已将 Sentry 配置为捕获 Django Celery 应用程序中的所有错误 它工作正常 但我发现一个令人讨厌的用例是当我必须重新启动我的 Celery 工作人员 PostgreSQL 数据库或消息服务器时 这会导致数千种各种 无法访
  • numpy.polyval() 的反函数

    我想知道 np polyval 是否有一个方便的反函数 我在其中给出 y 值并求解 x 我知道我可以做到这一点的一种方法是 import numpy as np Set up the question p np array 1 1 10 y
  • 如何隐藏 Tkinter python Gui

    有人知道如何隐藏 python GUI Tkinter 我已经创建了键盘记录器 对于 GUI 我使用了 python 模块 Tkinter 我想添加名为 HIDE 的按钮 因此当用户单击它时 它将隐藏 GUI 当用户按下 CTRL E 之类
  • 如何让 Python 生成器返回 None 而不是 StopIteration?

    我使用生成器在列表中执行搜索 如下简单示例 gt gt gt a 1 2 3 4 gt gt gt i for i v in enumerate a if v 4 next 3 只是为了稍微说明一下示例 与上面的列表相比 我使用的列表要长得
  • ValueError:序列太大;不能大于 32

    我写了这段代码 from Crypto Cipher import AES import numpy as np import cv2 base64 BLOCK SIZE 16 PADDING pad lambda s s BLOCK SI
  • 为什么变量 1 += 变量 2 比变量 1 = 变量 1 + 变量 2 快得多?

    我继承了一些 Python 代码 用于创建巨大的表 最多 19 列宽 5000 行 花了九秒用于在屏幕上绘制表格 我注意到每一行都是使用以下代码添加的 sTable sTable n GetRow where sTable是一个字符串 我将
  • print() 函数的有趣/奇怪的机制

    我正在学习Python 我目前正在学习如何定义自己的函数 并且在尝试理解返回值和打印它之间的区别时遇到了一些困难 我读到的关于这个主题的描述对我来说不太清楚 所以我开始自己尝试 我想我现在已经明白了 如果我没记错的话 区别在于你可以传递 a

随机推荐

  • 发布 apk 中的“来源不明”

    我的调试 APK 中的所有内容都运行良好 但是 当我导出 APK 并安装它时 一切正常 直到我调用引用的库 E AndroidRuntime 32571 at com znood znoodapp ShowResultsActivity a
  • 将私有 Java 9 模块包公开给 JUnit 的正确方法是什么?

    我有一个 可执行 Java 9 模块 意味着它不会公开任何包 它只包含一个main函数 我需要测试 我正在使用 Gradle 的java library and org gradle java experimental jigsaw插件 我
  • 如何将 csv/文本文件从 Android 手机发送到 WiFi 打印机?

    我正在开发一个 Android 应用程序 我应该从数据库中获取 csv txt 文件格式的数据 然后我必须将文件发送到 wifi 打印机 有谁知道我如何开始这样做 答案终于很简单 Socket client new Socket IP PO
  • MonkeyPatching ActiveJobs

    我在 ActiveJobs 的猴子修补部分遇到问题 我在 config initializers extensions arguements rb 中有以下代码 module ActiveJob module Arguments TYPE
  • 通过 Laravel 框架集成现有项目?

    我已经从 github 克隆了一个项目 现在我需要集成该项目 那么如何使用 laravel 框架 我是否需要创建一个新项目然后需要替换文件夹 或任何其他替代方案 因为我是这个框架的新手 帮助我 这是一个广泛的问题 因为这取决于您的项目 而我
  • 输入名称上的 React hook 表单 useFieldArray 打字稿错误

    我在动态表单的打字稿中编写了以下内容 type FormData name string session name string const control register handleSubmit useForm
  • 在 React 中渲染来自 Firebase 的数据

    请帮助我渲染从 Firebase 实时数据库检索的数据 我成功从 Firebase 中以数组形式检索数据 下一步是显示数据 问题就从这里开始了 我想要显示的数据应该存储在 模块 状态 首先 它被设置为一个空数组 然后检索数据 通过 Coum
  • 使用 spaCy 添加多个 EntityRuler(ValueError:'entity_ruler' 已存在于管道中)

    下列link https stackoverflow com questions 57477852 spacy matcher with entities spanning more than a single token展示如何在实体跨越
  • 手动编码为 MPEG-TS

    SO 我正在尝试采用 H264 附件 B 字节流视频并将其编码为纯 Java 中的 MPEG TS 我的目标是创建一个最小的 MPEG TS 单节目 有效流 并且不包含任何定时信息 PCR PTS DTS 我目前处于可以将生成的文件传递给
  • 如何使用python在ID3v2 mp3文件上添加SYLT(同步歌词)标签?

    我想使用 python 在我的 mp3 文件上添加来自 vtt 的同步歌词 我尝试使用诱变模块 但它没有按预期工作 from mutagen id3 import ID3 USLT SLT import sys import webvtt
  • PHP正则表达式在wordpress短代码标签之间替换

    我有一个短代码 我希望能够根据帖子的上下文将其删除 例如 tooltip slug test Test Text tooltip 我希望输出是 span class dummy Test Text span 我已经用 preg replac
  • 即使在不活动状态下,Hangfire 也会继续运行 SQL 查询

    我正在开发一个 ASP net MVC 5 网站 并使用 Hangfire 来安排一些任务 在本例中每 3 分钟一次 我知道一个事实是 运行这样的任务 以及与之相关的数据库查询 只需要几秒钟 我面临的问题是 Hangfire 似乎让我的 S
  • Zend Framework 中数据库驱动路由的教程?

    我正在开发一个需要使用数据库驱动的 MVC 方案的项目 其中控制器和视图的路由通过单个数据库表进行控制 但是 我无法找到任何使用当前版本的框架演示这一点的教程 它们似乎都是在几个版本之前编写的 我想知道是否有人用更新的版本做过类似的事情框架
  • 什么是 data.frame 可以做而 data.table 不能做的事情?

    我刚刚开始使用 R 并遇到了 data table 我发现它很棒 一个非常天真的问题 我可以忽略 data frame 来使用 data table 以避免两个包之间的语法混淆吗 来自数据表常见问题解答 http datatable r f
  • 使用 axios get 请求发送对象[重复]

    这个问题在这里已经有答案了 我想发送一个带有对象的获取请求 对象数据将在服务器上用于更新会话数据 但该对象似乎没有正确发送 因为如果我尝试将其发送回去打印出来 我只会得到 N 我可以像这样使用 jQuery 来完成它 它可以工作 get m
  • 对指针列表进行排序

    我再次发现自己在 C 中的一些非常简单的任务上失败了 有时我希望我能从 Java 中的 OO 中学到所有知识 因为我的问题通常是从像 Java 一样思考开始的 无论如何 我有一个std list
  • “双免”是什么意思?

    正如标题所暗示的那样 我是 C 语言的新手 并且很快就会有期中考试 我目前正在修改过去的论文 一个反复出现的主题是双重自由问题 我理解就是调用的过程free 在同一个内存位置两次 但我有几个问题我不能 100 确定如何回答 问题1 C中双重
  • Powershell从网站ie.document下载文件方法

    我创建了一个小脚本 使用 Internet explore 11 登录到 https 网站 我手动单击鼠标将文件下载到 IE 但我收到保存打开文件的提示 我希望能够绕过此问题 因为我要在后台运行这个吗 我是否在 ie navigate ur
  • 我可以通过编程方式选择 Android 布局文件夹吗?

    我正在构建一个 Android 应用程序 它使用不同的布局文件夹 即 Large xlarge 等 根据屏幕尺寸调整大小 唯一的问题是 我想为用户提供一种在小屏幕布局和大屏幕布局之间切换的方法 以防他们拥有无法识别 xlarge 标签的前蜂
  • 为什么 python 的 __init__ 函数没有 return 语句,即使它是一个函数

    这可能是一个愚蠢的问题 但我很想知道答案 根据官方文件 init 不需要return语句 有什么特殊原因会这样吗 gt gt gt class Complex def init self realpart imagpart self r r