Python子类调用父类__init__方法出现str无Teamname属性如何解决
问题原因
报错的核心是调用父类__init__方法时未传入实例对象self:
- 类的实例方法第一个参数永远指向当前实例本身,你直接写
Team.__init__(Tname,Torigin)时,程序会把你传入的第一个参数Tname(也就是字符串Gokulam)识别为self,尝试给这个字符串对象设置Teamname属性,自然会抛出'str' object has no attribute 'Teamname'的错误。 - 额外问题:
__str__方法返回的字符串没有加空格,输出结果会连在一起,可读性差。
正确调用父类构造方法的两种方式
方式1:显式调用父类方法,主动传入self
把Team.__init__(Tname,Torigin)改成Team.__init__(self, Tname, Torigin)即可。
方式2:使用super()调用(更推荐,适配多继承场景)
把这行改成super().__init__(Tname, Torigin),不需要手动传self,super()会自动定位父类并传入当前实例。
修复后的完整代码
class Team: def __init__(self, Name = "Name", Origin = "india"): self.Teamname = Name self.Teamorigin = Origin def DefTeamname(self, Name): self.Teamname = Name def defTeamorigin(self, Origin): self.Teamorigin = Origin class Player(Team): def __init__(self, Pname, Ppoints, Tname, Torigin): # 用super方式调用父类构造 super().__init__(Tname, Torigin) self.Playername = Pname self.Playerpoints = Ppoints def Scoredpoint(self): self.Playerpoints += 1 def __str__(self): # 加空格优化输出格式 return self.Playername + " has scored " + str(self.Playerpoints) + " points" Player1 = Player('Sid',0,'Gokulam','Kochi') print(Player1) # 输出:Sid has scored 0 points
内容的提问来源于stack exchange,提问作者Akhil
相关产品推荐
相关产品推荐

