Python类继承报错:__init__缺失7个必填位置参数问题排查
问题原因及修复方案
核心错误点
- 实例化
Dog类的传参完全错误:你定义的Dog类构造方法__init__需要8个位置参数name/legs/place/move/weight/lenght/feather/aggresivity,但你写的Dog = Dog(animal)仅传入了animal类对象这一个参数,直接触发缺少7个参数的报错。同时不要把实例名和类名都设为Dog,会覆盖原类定义。 super()调用父类构造方法时多传了self参数:super()已经自动绑定了当前实例,调用父类方法时不需要手动传入self,你的代码super().__init__(self,name,legs,place,move,weight,lenght)多传的self会导致参数匹配错位。__str__方法存在递归调用风险:你在format的第一个参数传入了self,打印时会自动调用self.__str__(),形成无限递归直接崩溃,同时占位符数量和传入的参数数量也不匹配。- 主逻辑的输入选择仅获取了一次:
choice只在循环外读取了一次,执行完一次操作后不会再次读取用户新的选择,会一直卡在同一个分支。
修正后的可运行代码
import random class Animal(): def __init__(self,name,legs,place,move,weight,lenght): self.name = name self.legs = legs self.place = place self.move = move self.weight = weight self.lenght = lenght def __str__(self): return "Name: {}\nLegs: {}\nPlace: {}\nMove: {}\nWeight: {}\nLenght: {}".format(self.name,self.legs,self.place,self.move,self.weight,self.lenght) def add_info(self): info_name = input("Enter name: ") info_legs = input("Enter how many legs this animal have: ") info_place = input("Enter where this animal live: ") info_move = input("Enter how move this animal: ") info_weight = input("Enter Weight: ") info_lenght =input("Enter lenght: ") self.name = info_name self.legs = info_legs self.place = info_place self.move = info_move self.weight = info_weight self.lenght = info_lenght class Dog(Animal): def __init__(self,name,legs,place,move,weight,lenght,feather,aggresivity): # 去掉多余的self参数 super().__init__(name,legs,place,move,weight,lenght) self.feather = feather self.aggresivity = aggresivity def __str__(self): # 去掉第一个多余的self,避免递归 return "Name: {}\nLegs: {}\nPlace: {}\nMove: {}\nWeight: {}\nLenght: {}\nFeather: {}\nAggresivity: {}".format(self.name, self.legs,self.place, self.move,self.weight, self.lenght,self.feather,self.aggresivity) def add_info(self): super().add_info() info_feather = input("Enter are your dog have feather or not 'have' or 'haven't: ") info_aggresivity =input("Enter are your dog aggresive or passive: ") self.feather = info_feather self.aggresivity = info_aggresivity def pick_random(self): list_dog = ["Labrador","Bulldog","Retriever","Poodle","Beagle","Husky"] random_dog = random.choice(list_dog) print("Your dog is :",random_dog) # 先实例化带初始占位参数的Dog对象,后续调用add_info再覆盖属性即可 my_dog = Dog(name="", legs="", place="", move="", weight="", lenght="", feather="", aggresivity="") print(""" 1 for add info to your dog 2 for get infos your dog have 3 for pick random dog type q for quit """) while True: # 每次循环都读取用户新选择 choice = input("Enter operation: ") if choice =="q": print("BYE...") break elif choice == "1": my_dog.add_info() elif choice =="2": print(my_dog) elif choice =="3": my_dog.pick_random() else: print("Invalid operation")
内容的提问来源于stack exchange,提问作者mesut.a
相关产品推荐
相关产品推荐

