为什么我的类没有通过“def __init__”或“def __init__”初始化?为什么我会收到“不带参数”类型错误或属性错误?

2024-03-19

如果您的问题作为与此重复的问题而被关闭,那是因为您有一个代码示例,其中包含以下内容:

class Example:
    def __int__(self, parameter):
        self.attribute = parameter

or:

class Example:
    def _init_(self, parameter):
        self.attribute = parameter

当您随后尝试创建该类的实例时,会发生错误:

>>> Example("an argument")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Example() takes no arguments

(在某些版本的 Python 中,错误可能会显示TypeError: object.__new__() takes no parameters.)

或者,该类的实例似乎缺少属性:

>>> class Example:
...     def __int__(self): # or _init_
...         self.attribute = 'value'

>>> Example().attribute
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Example' object has no attribute 'attribute'

您可能还想知道:这些异常消息意味着什么,它们与问题有何关系?为什么没有更早地出现问题,例如类定义本身的问题?问题还可能如何体现?今后我该如何防范这个问题呢?


This is an artificial canonical question https://meta.stackoverflow.com/questions/291992/what-is-a-canonical-question-answer-and-what-is-their-purpose created specifically to head off two of the most common typographical errors in code written by new Python programmers. While questions caused by a typo are normally closed for that reason, there are some useful things to explain in this case, and having a duplicate target allows for closing questions faster. I have tried to design the question to be easy to search for.

See also TypeError: __init__() should return None, not 'int' https://stackoverflow.com/questions/36666353 for the opposite problem - writing __init__ instead of __int__ when trying to make a class that can be converted to integer.


这是因为代码有一个简单的拼写错误:该方法应该被命名__init__- 注意拼写,并注意有two两边都有下划线。

异常消息的含义是什么?它们与问题有何关系?

正如人们可能猜测的那样,一个TypeError is an error这与type东西。在这种情况下,意思有点牵强:Pythonalso将此错误类型用于函数调用,其中论点 https://docs.python.org/3/glossary.html#term-argument(你放在中间的东西()为了调用函数、类构造函数或其他callable https://docs.python.org/3/glossary.html#term-callable)无法正确分配给参数 https://docs.python.org/3/glossary.html#term-parameter(你放在之间的东西()当使用def句法)。

在示例中,其中TypeError发生时,类构造函数为Example不接受参数。为什么?因为它使用的是底座object构造函数,它不带参数。这只是遵循正常的继承规则:没有__init__本地定义的,因此来自超类的 - 在这种情况下,object- 用来。

同样,一个AttributeError is an error这与属性东西。这非常简单:实例Example没有任何.attribute属性,因为构造函数(同样来自object由于拼写错误)没有设置一个。

为什么没有更早地出现问题,例如类定义本身的问题?

因为名称输入错误的方法在语法上仍然有效。仅语法错误(报告为SyntaxError) 可以在代码运行之前捕获。 Python 没有为名为的方法分配任何特殊含义_init_(两边各有一个下划线),所以它不关心参数是什么。尽管__int__ https://docs.python.org/3/reference/datamodel.html#object.__int__用于将类的实例转换为整数,并且除此之外不应有任何参数self, 它还是句法上 valid.

您的 IDE 可能会警告您__int__带有可疑参数的方法(即除了self)。然而,a) 这并不能完全解决问题(见下文),b) IDE 可能一开始就帮助您弄错了(通过提出错误的自动完成建议)。

The _init_如今,打字错误似乎已经不那么常见了。我的猜测是,人们过去在阅读排版不佳的书籍中的示例代码后会这样做。

问题还可能如何体现?

在实例创建成功(但未正确初始化)的情况下,任何类型的问题以后可能会发生(取决于why需要正确的初始化)。例如:

BOMB_IS_SET = True

class DefusalExpert():
    def __int__(self):
        global BOMB_IS_SET
        BOMB_IS_SET = False
    def congratulate(self):
        if BOMB_IS_SET:
            raise RuntimeError("everything blew up, gg")
        else:
            print("hooray!")

>>> d = DefusalExpert()
>>> d.congratulate()
Traceback (most recent call last):
  ...
RuntimeError: everything blew up, gg

如果您打算将该类转换为整数并且还写了__int__故意地,last其中一个优先:

class LoneliestNumber:
    def __int__(self):
        return 1
    def __int__(self): # was supposed to be __init__
        self.two = "can be as bad"

>>> int(LoneliestNumber())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __int__ returned non-int (type NoneType)

将来我该如何预防这个问题?

没有灵丹妙药。我发现始终坚持这样的惯例会有所帮助__init__(和/或__new__) 作为类中的第一个方法(如果类需要)。然而,校对或培训是无可替代的。

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

为什么我的类没有通过“def __init__”或“def __init__”初始化?为什么我会收到“不带参数”类型错误或属性错误? 的相关文章

随机推荐

  • 无法解析 fromJson

    我看过了这个线程 https stackoverflow com questions 17453406 gson with mixed read and 这个线程 https stackoverflow com questions 3231
  • CodeIgniter 1.7 升级到 2.1 后出现未定义的 $load 属性错误

    为什么在将 CodeIgniter 从 v1 7 升级到 v2 1 后出现此错误 A PHP Error was encountered Severity Notice Message Undefined property Site loa
  • 在 uwsgi 下运行的单元测试 Flask 应用程序

    我对 python 比较陌生 正在寻找一种 pythonic 方法来处理这种实践 我继承了一个相当简单的 Python 2 7 Flask 应用程序 该应用程序在 uwsgi 下运行 我想向其中添加一些单元测试 它在缩进级别 0 上进行一些
  • SQL FOR XML 路径列表和计数

    我有一张表 例如 Date Name 20 May 2011 Bob 20 May 2011 Fred 20 May 2011 Jim 21 May 2011 Bob 21 May 2011 Ed 22 May 2011 Bill 我需要一
  • 如何检查 ASP.NET 4 是否注册为在 IIS 7.5 中运行?

    如何检查 ASP NET 4 是否注册为在 IIS 7 5 中运行 除了运行之外 必须有某种方法可以确定这一点 aspnet regiis i 从框架的文件夹内 我不需要以编程方式检查这一点 只需通过 IIS 管理器或命令行即可 我有一个
  • setFirstResult 和 setMaxResult 与 Order By 配合使用效果不佳

    什么可能导致CriteriaQuery orderBy方法停止工作 以下是具体实现 OpenJPAEntityManager kem OpenJPAPersistence cast entityManager kem getFetchPla
  • 将 JSON 字符串转换为 JAVA 中的通用对象(使用 GSON)

    我有一个返回 JSON 的 Api 响应采用某种格式 可以放入名为 ApiResult 的对象中 并包含Context
  • 如何计算贝塞尔曲线的面积?

    给定以下描述 SVG 三次贝塞尔曲线的路径 例如 M 300 140 C 300 40 500 40 500 140 并假设有一条直线连接端点300 140 to 500 140 封闭曲线下的面积 是否可以计算如此封闭的面积 谁能建议一个公
  • 如何创建自定义 haar 分类器?

    我正在努力创建一个自定义 haar 分类器 我在网上找到了一些教程 但他们没有指定他们使用的是哪个版本的 opencv 我需要的是一个非常简洁和简化的所需步骤示例 以及一个简单的图像数据集 我还需要知道 opencv 版本和操作系统平台 以
  • Rails 7 不会通过“generatescaffold”命令生成 SCSS 文件

    我在 Rails 7 中创建了一个新项目 每当我使用生成脚本时 rails generate scaffold or rails generate controller 除了 css scss 之外 所有生成的文件都会被创建 显然 我不是唯
  • svn 客户端超时并破坏 WC 状态

    当我提交较大的更改 数百兆字节 时 即使签入确实完成 客户端也会超时 当我右键单击 WC 并显示日志时 TSVN 显示即使实际签入 WC 修订版也不会更新 我尝试过使用TortoiseSVN 1 9 5 Build 27581 64 Bit
  • 静止搜索性能

    这是一个双重问题 我组装了一个简单的国际象棋引擎 它执行 Alpha Beta 搜索 最后执行静止搜索 静止搜索正在影响性能 问题是 这是可以接受的性能影响吗 如果不是 那么应该采取什么措施来解决这个问题 下图给出了性能影响 请注意 这些统
  • 出现“无法将 PersistentGenericSet 转换为 ISet”错误

    我收到此错误 无法转换类型的对象 NHibernate Collection Generic PersistentGenericSet1 IocWinFormTestEntities People to type System Collec
  • 如何禁用apache2中的mod_deflate?

    如何在 Apache2 中禁用 mod deflate 对于特定目录中的文件 OR 对于所有具有扩展名的文件 例如 py 您可以设置环境变量no gzip http httpd apache org docs 2 2 mod mod def
  • MAVEN_OPTS 与 mvn -D

    我认为两者都定义了相同的 JVM 属性 但两者之间显然存在差异 我找不到明确的解释 如果我在构建的 Jenkins Maven 中使用两者 则只有 D 设置的属性在 System getProperties 的 Java 应用程序中可见 尽
  • p:fileDownload bean方法被调用但文件下载不显示

    您好 我正在使用 JSF 和 Primefaces 进行文件上传和下载相同的文件操作 我结合使用来自不同论坛和博客的技术 BelusC 的博客和 Primefaces Showcase 该操作的主要思想是让用户上传文件并 为上传的文件生成一
  • 数据库连接应该是单例吗?

    Java 中创建单例的最佳方式是什么 数据库连接应该是单例 作为单例它自动是线程安全的 因为理论上数据库不能被许多用户同时访问 数据库连接通常不应是单例 两个原因 许多数据库驱动程序都不是线程安全的 使用单例意味着如果您有许多线程 它们将共
  • 从 phpmailer 获取原始 rfc822 消息

    我正在尝试使用 google api php client 和 gmail api 来允许我的用户验证他们的 gmail 帐户并通过我的网站发送电子邮件 我问了一个更通用的问题 https stackoverflow com questio
  • 时间:2019-03-17 标签:c#Linqselect不同的日期时间天

    我有以下方法 我计划返回一堆不同的日期时间对象 我所说的独特是指独特的日子 不包括时间 问题是 DateTime 对象具有不同的时间 因此即使它们是同一天 也会被评估为唯一 如何让查询忽略日期的时间部分并仅评估日期的唯一性 public L
  • 为什么我的类没有通过“def __init__”或“def __init__”初始化?为什么我会收到“不带参数”类型错误或属性错误?

    如果您的问题作为与此重复的问题而被关闭 那是因为您有一个代码示例 其中包含以下内容 class Example def int self parameter self attribute parameter or class Example