Python类绑定抛出异常:TypeError问题及版本差异咨询
你的Python类代码报错原因解析及修正方案
嘿,我来帮你拆解这两个报错的根源,都是类定义里的基础细节没踩对,和Python 3.1 vs 3.6的版本差异没关系哦~
第一个错误:TypeError: object() takes no parameters
你写的构造函数是_init_,但Python对类的构造函数有严格的命名要求——必须是前后各两个下划线的__init__!因为少写了一个下划线,Python根本没把这个方法识别成类的构造函数,创建实例时就会调用默认的object类构造函数,而这个默认构造函数不接受任何参数,所以你传'hello'就触发了报错。
第二个错误:TypeError: print_msg() takes 1 positional argument but 2 were given
首先要明确:print_msg是一个实例方法,这类方法的第一个参数self是Python自动帮你传入的(代表当前创建的实例对象),不需要你手动传递参数。
你遇到这个报错的场景分两种可能:
- 如果你是直接通过类调用:
MyPythonClass.print_msg('hello'),这时候Python不会自动传入self,你传的'hello'会被当成self参数,但实例方法的调用规则是必须通过实例来触发,这种调用方式本身就不符合规范。 - 如果你是创建实例后调用:
inst.print_msg('hello'),这时候Python已经自动把inst作为self传入方法了,你再额外传'hello',就相当于给方法传了两个参数(self+'hello'),但方法只接受self一个参数,所以报错说“需要1个参数但传了2个”。
修正后的代码
把构造函数的下划线改对,再按正确方式调用方法就可以了:
class MyPythonClass(): # 修正构造函数的命名:__init__(前后各两个下划线) def __init__(self, msg): self.msg = msg self.print_msg() def print_msg(self): # 直接用实例属性self.msg,不需要额外传参数 print(self.msg) # 正常创建实例,会自动调用构造函数和print_msg inst = MyPythonClass('hello') # 通过实例调用print_msg,不需要传参数 inst.print_msg()
关键知识点总结
- Python的特殊方法(比如构造函数
__init__)必须用双下划线包裹,这是跨版本的通用规则,和3.1/3.6无关。 - 实例方法的
self参数是Python自动注入的,调用时千万别手动传参。 - 如果想直接通过类调用方法,可以把它改成类方法(用
@classmethod装饰,第一个参数改为cls),不过你的场景用实例方法就足够啦。
内容的提问来源于stack exchange,提问作者slackexchange
相关产品推荐
相关产品推荐

