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
相关产品推荐
相关产品推荐

