You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:39:02