为什么我的类没有通过“def __int__”或“def _init_”初始化?为什么我会得到“不带参数”类型错误或 AttributeError?

2024-12-18 08:39:00
admin
原创
141
摘要:问题描述:如果您的问题因与此问题重复而被关闭,那是因为您有一个代码示例,其中包含以下内容:class Example: def __int__(self, parameter): self.attribute = parameter 或者:class Example: def ...

问题描述:

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

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

或者:

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'

您可能还想知道:这些异常消息是什么意思,它们与问题有何关系?为什么问题没有更早出现(例如,类定义本身)?问题还会以其他方式表现出来?我如何防范将来出现此问题?


这是一个人工创建的规范问题,专门用于解决 Python 新手程序员编写的代码中最常见的两个拼写错误。虽然由于拼写错误而导致的问题通常会因此关闭,但在这种情况下需要解释一些有用的事情,并且设置重复目标可以更快地关闭问题。我试图将问题设计得易于搜索。

另请参阅TypeError:__init__() 应该返回 None,而不是“int”,以解决相反的问题 -在尝试创建可以转换为整数的类时,写成__init__而不是。__int__


解决方案 1:

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

异常消息是什么意思?它们与问题有何关系?

正如人们可能猜到的那样,aTypeError是与某种类型有关的错误。在这种情况下,其含义有点牵强:Python还将此错误类型用于函数调用,其中参数(为了调用函数、类构造函数或其他可调用函数而放在中间的东西)无法正确分配给参数(使用语法编写函数时放在中间的东西)。()`()`def

在出现a 的示例中TypeError,类的构造函数Example不接受参数。为什么?因为它使用的是不接受参数的基object构造函数。这只是遵循了正常的继承规则:没有本地定义,因此使用__init__超类中的构造函数(在本例中)。object

类似地,AttributeError是与某事物的属性有关的错误。这很简单: 的实例没有任何属性,因为构造函数(再次,由于拼写错误而来自)没有设置属性。Example`.attribute`object

为什么之前没有出现问题,例如类定义本身的问题?

因为方法名输入错误在语法上仍然有效。SyntaxError在代码运行之前只能捕获语法错误(报告为)。Python 不会为命名的方法_init_(两边各有一个下划线)赋予任何特殊含义,因此它不关心参数是什么。虽然__int__用于将类的实例转换为整数,并且除了之外不应有任何参数self,但它在语法上仍然有效

您的 IDE 可能会警告您某个__int__方法采用了可疑参数(即除 之外的任何参数self)。但是,a) 这并不能完全解决问题(见下文),并且 b) IDE 可能一开始就帮助您犯了错误(通过提供错误的自动完成建议)。

如今,这种_init_拼写错误似乎已经不那么常见了。我猜人们以前在阅读排版糟糕的书籍示例代码后就会犯这种错误。

问题还会以其他什么形式表现出来?

如果成功创建了实例(但未正确初始化),则以后可能会发生任何类型的问题(取决于需要正确初始化的原因)。例如:

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__特意这样写,则最后一个将优先:

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__(and/or __new__) 作为类中的第一个方法的惯例会有所帮助。但是,校对或培训是无可替代的。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用