Python类用__int__或_init_为何初始化报TypeError/AttributeError?
触发重复问题关闭的典型错误写法
如果你的问题被作为本问题的重复问题关闭,原因是你提供的代码示例中出现了以下两类拼写错误之一:
- 误将类构造方法名写为
__int__(把init拼写成了int):
class Example: def __int__(self, parameter): self.attribute = parameter
- 构造方法名前后的下划线数量写错,写成单下划线包裹的
_init_:
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): # 也可能是写成了_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类的实例初始化构造方法有固定的命名要求:方法名必须是__init__,名字前后各有两个连续的下划线。如果方法名拼写不符合要求,Python不会将其识别为创建实例时自动调用的构造方法:此时创建实例传入的参数没有对应的接收入口,就会抛出“类不接收参数”的错误;同时拼写错误的方法不会在实例化时自动执行,方法内部定义的实例属性自然不会被绑定到实例上,访问属性时就会抛出“属性不存在”的错误。 - 为什么这类错误不会在类定义阶段被提前检测到?
Python语法允许类中定义任意合法名称的方法:__int__本身就是Python预留的特殊方法,作用是定义实例被int()转换时的逻辑;_init_则是完全合法的普通方法名称。因此解释器在加载类定义时不会判定这是语法错误,问题只会在实例创建、属性访问等实际运行环节暴露。 - 编码时如何规避这类低级拼写错误?
- 牢记Python双下划线特殊方法(俗称“dunder方法”)的命名规则,不要混淆方法名、不要写错前后的下划线数量
- 开启编辑器/IDE的Python语法补全功能,编写构造方法时通过自动补全生成
__init__方法定义,减少手动逐字输入的拼写失误 - 类定义完成后第一时间做简单的实例化、属性访问测试,尽早发现初始化逻辑的问题
这是专门为解决Python新手最常犯的两类构造方法拼写错误创建的人工规范问答条目。虽然纯拼写错误导致的问题通常会以重复问题为由关闭,但本场景涉及Python特殊方法机制的基础知识点,设置统一的重复问题指向可以提升社区问题处理效率,本问题设计时也充分考虑了各类关键词的搜索匹配便利性。
反向场景参考:如果在实现整数转换逻辑时,误将
__int__方法写为__init__,会触发TypeError: __init__() should return None, not 'int'错误,可查找对应问题的解答。
内容的提问来源于stack exchange,提问作者Karl Knechtel
相关产品推荐
相关产品推荐

