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

Python 3.6(Spyder)类与继承:新手关于Animal与Dog类的技术问询

Python类继承:从Animal到Dog的实现指南

嘿,作为Python新手碰到类继承的问题太正常了,我来一步步帮你搞定这个Animal和Dog的继承场景~

先修正你的Animal类

首先咱们先把你提供的Animal类补全并修正小细节:你代码里__sound的初始值设成0不太合理(声音应该是字符串),还有get_height方法没写完,我帮你补完整:

class Animal:
    __name = ""
    __height = 0
    __weight = 0
    __sound = ""  # 修正为字符串类型

    # 构造方法
    def __init__(self, name, height, weight, sound):
        self.__name = name
        self.__height = height
        self.__weight = weight
        self.__sound = sound

    def set_name(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

    def set_height(self, height):
        self.__height = height

    def get_height(self):
        return self.__height

    def set_weight(self, weight):
        self.__weight = weight

    def get_weight(self):
        return self.__weight

    def set_sound(self, sound):
        self.__sound = sound

    def get_sound(self):
        return self.__sound

创建Dog子类的正确姿势

因为Animal里的属性都是双下划线开头的私有属性(Python会对这类属性做名称修饰,子类无法直接访问),所以咱们得通过调用父类的构造方法和公共方法来实现继承。下面是完整的Dog子类实现:

class Dog(Animal):
    # 给Dog添加专属属性:品种
    __breed = ""

    def __init__(self, name, height, weight, sound, breed):
        # 调用父类的构造方法,初始化Animal的属性
        super().__init__(name, height, weight, sound)
        # 初始化Dog的专属属性
        self.__breed = breed

    # 添加Dog的专属方法:捡东西
    def fetch(self):
        print(f"{self.get_name()} 正在开心地捡球!")

    # 给品种添加get/set方法
    def set_breed(self, breed):
        self.__breed = breed

    def get_breed(self):
        return self.__breed

关键知识点解释

  • 继承语法:class Dog(Animal) 表示Dog类继承自Animal类,Dog会自动拥有Animal的所有公共方法(比如get_name、set_sound)。
  • super()函数:用来调用父类的方法,比如super().__init__(...) 帮我们复用了父类初始化属性的代码,不用重复写一遍。
  • 私有属性的注意事项:双下划线开头的属性(比如__name)会被Python重命名为_Animal__name,所以子类里直接写self.__name会报错,必须通过父类提供的get/set方法来访问或修改。如果想让子类能直接访问属性,建议把双下划线改成单下划线(比如_name),这是Python里的保护属性约定——对外隐藏,但子类可以访问。

更Pythonic的优化建议

Python里不推荐用get_xxx/set_xxx这种Java风格的方法,而是用@property装饰器来实现属性的访问和修改,代码更简洁:

class Animal:
    def __init__(self, name, height, weight, sound):
        self.__name = name
        self.__height = height
        self.__weight = weight
        self.__sound = sound

    # 用@property定义name的获取方法
    @property
    def name(self):
        return self.__name

    # 用@name.setter定义name的修改方法
    @name.setter
    def name(self, value):
        # 还可以在这里加参数校验,比如名字不能为空
        if not value:
            raise ValueError("名字不能为空!")
        self.__name = value

    # 同理实现height、weight、sound的@property和setter
    @property
    def height(self):
        return self.__height

    @height.setter
    def height(self, value):
        if value <= 0:
            raise ValueError("身高必须大于0!")
        self.__height = value

    @property
    def sound(self):
        return self.__sound

    @sound.setter
    def sound(self, value):
        self.__sound = value

用这种方式,访问属性就像直接访问变量一样:

my_dog = Dog("旺财", 50, 15, "汪汪汪", "哈士奇")
print(my_dog.name)  # 代替get_name()
my_dog.name = "来福"  # 代替set_name("来福")

内容的提问来源于stack exchange,提问作者alc95

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:25:05