子类错误传递self给父类__init__后输出的对象地址含义解析
问题解答:Python对象默认输出的含义与代码错误分析
首先,你看到的 <Wizard.Wizard object at 0x049F20B0> 是Python中对象的默认字符串表示形式,拆解各部分的意思:
Wizard.Wizard:说明这个实例来自Wizard模块里的Wizard类(如果代码都在同一个文件中,这里会显示__main__.Wizard);object at 0x049F20B0:0x049F20B0是该对象在计算机内存中的十六进制地址,每个对象在内存中都有唯一的存储位置,这个地址就是它的专属标识。
为什么会出现这种情况?
问题出在Wizard子类的__init__方法里的父类调用:
super().__init__(self,name)
在Python中,使用super()调用父类方法时,不需要手动传递self参数——super()已经自动绑定了当前子类的实例。你多传了一个self,直接导致参数顺序完全错乱:
- 父类
Player的__init__期望第一个参数是name,第二个是player_type; - 但你传了
self(也就是gandalf实例本身)作为第一个参数,把"Gandalf"当成了第二个参数player_type。
最终的赋值结果完全搞反了:
self.name = self(把实例自己赋值给了name属性);self.player_type = "Gandalf"(把本该是名字的字符串赋值给了player_type)。
当你打印gandalf.name时,其实是在打印一个对象,Python就会输出它的默认字符串表示,也就是你看到的那串地址信息。
修正后的代码
把Wizard类的__init__改成这样就正常了:
from Player import Player class Wizard(Player): def __init__(self, name, player_type = "Wizard"): super().__init__(name, player_type)
这样调用父类时参数顺序正确,gandalf.name会输出"Gandalf",gandalf.player_type会输出"Wizard"。
内容的提问来源于stack exchange,提问作者user9814172
相关产品推荐
相关产品推荐

