Day_12 · 面向对象(二):继承与 __str__ #13

Open
opened 2026-08-22 17:26:37 +08:00 by shimmer · 30 comments
Owner

题目与教程详见仓库对应目录 Day_12/README.md(本仓库已克隆即得)。

预计耗时:25~30 分钟
Django 里所有模型都写 class Article(models.Model)——models.Model 就是被继承的"基类"。
今天亲手写一次继承,你就明白 Django 的模型为什么"自带保存能力"。

今日知识点

  • 继承:class Dog(Animal): —— Dog 是 Animal 的"子类",自动拥有 Animal 的全部方法
  • 重写:子类里再写一遍同名方法,就覆盖父类的实现
  • super():在子类方法里调用父类的方法(super().方法())
  • __str__:定义"这个对象打印出来长什么样"(print(对象) 时触发)

先学(教程)

任务(后做)

新建 day12.py:

  1. 基类 + 两个子类:
    class Animal:
        def __init__(self, name):
            self.name = name
    
        def speak(self):
            print("...")
    
    class Dog(Animal):
        def speak(self):            # 重写:覆盖父类
            print(f"{self.name}:汪汪!")
    
    class Cat(Animal):
        def speak(self):
            print(f"{self.name}:喵喵!")
    
    d = Dog("旺财")
    c = Cat("咪咪")
    d.speak()          # 旺财:汪汪!
    c.speak()          # 咪咪:喵喵!
    
  2. 给 Animal 加 __str__ 方法:
    # 在 Animal 类里加:
    def __str__(self):
        return self.name
    
    print(d)           # 打印出来是 旺财 而不是 <__main__.Dog object at ...>
    
  3. 进阶(加分):用 super()——给 Animal 加一个 info() 方法打印 我是动物,
    然后让 Dog 重写 info():先打印 我是狗,再调用 super().info(),
    调用 d.info() 观察两行输出和顺序。

完成标准

  • 汪汪 / 喵喵 输出正确
  • print(d) 显示的是狗名
  • 能说出"子类自动拥有父类的方法"这句话的意思
  • (进阶)super() 两行输出顺序正确

提交方式:把 day12.py 代码贴在当日工单评论里。

参考解答(先做再看)

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        print("...")

    def __str__(self):           # 打印对象时显示的名字
        return self.name

    def info(self):
        print("我是动物")

class Dog(Animal):
    def speak(self):
        print(f"{self.name}:汪汪!")

    def info(self):              # 进阶:super()
        print("我是狗")
        super().info()           # 调用父类的 info

class Cat(Animal):
    def speak(self):
        print(f"{self.name}:喵喵!")

d = Dog("旺财")
c = Cat("咪咪")
d.speak()
c.speak()
print(d)                         # 旺财
d.info()                         # 我是狗 / 我是动物
> 题目与教程详见仓库对应目录 Day_12/README.md(本仓库已克隆即得)。 > 预计耗时:25~30 分钟 > Django 里所有模型都写 `class Article(models.Model)`——`models.Model` 就是被继承的"基类"。 > 今天亲手写一次继承,你就明白 Django 的模型为什么"自带保存能力"。 ## 今日知识点 - **继承**:`class Dog(Animal):` —— Dog 是 Animal 的"子类",自动拥有 Animal 的全部方法 - **重写**:子类里再写一遍同名方法,就覆盖父类的实现 - **`super()`**:在子类方法里调用父类的方法(`super().方法()`) - **`__str__`**:定义"这个对象打印出来长什么样"(`print(对象)` 时触发) ## 先学(教程) - 菜鸟教程("面向对象"一节,重点看**继承**部分):https://www.runoob.com/python3/python3-class.html - B站黑马教程(看讲"继承"的几集):https://www.bilibili.com/video/BV1qW4y1a7fU/ ## 任务(后做) 新建 `day12.py`: 1. 基类 + 两个子类: ```python class Animal: def __init__(self, name): self.name = name def speak(self): print("...") class Dog(Animal): def speak(self): # 重写:覆盖父类 print(f"{self.name}:汪汪!") class Cat(Animal): def speak(self): print(f"{self.name}:喵喵!") d = Dog("旺财") c = Cat("咪咪") d.speak() # 旺财:汪汪! c.speak() # 咪咪:喵喵! ``` 2. 给 Animal 加 `__str__` 方法: ```python # 在 Animal 类里加: def __str__(self): return self.name print(d) # 打印出来是 旺财 而不是 <__main__.Dog object at ...> ``` 3. **进阶(加分)**:用 `super()`——给 Animal 加一个 `info()` 方法打印 `我是动物`, 然后让 Dog 重写 `info()`:先打印 `我是狗`,再调用 `super().info()`, 调用 `d.info()` 观察两行输出和顺序。 ## 完成标准 - [ ] 汪汪 / 喵喵 输出正确 - [ ] `print(d)` 显示的是狗名 - [ ] 能说出"子类自动拥有父类的方法"这句话的意思 - [ ] (进阶)super() 两行输出顺序正确 **提交方式**:把 `day12.py` 代码贴在当日工单评论里。 ## 参考解答(先做再看) ```python class Animal: def __init__(self, name): self.name = name def speak(self): print("...") def __str__(self): # 打印对象时显示的名字 return self.name def info(self): print("我是动物") class Dog(Animal): def speak(self): print(f"{self.name}:汪汪!") def info(self): # 进阶:super() print("我是狗") super().info() # 调用父类的 info class Cat(Animal): def speak(self): print(f"{self.name}:喵喵!") d = Dog("旺财") c = Cat("咪咪") d.speak() c.speak() print(d) # 旺财 d.info() # 我是狗 / 我是动物 ```
image.png
<img width="965" alt="image.png" src="attachments/088ae982-5736-415d-8090-910eb6148314">
142 KiB

image.png

![image.png](/attachments/be662a25-212b-4101-ae49-0357b301904c)

image.png

![image.png](/attachments/0cb17c35-baa0-4e94-adfb-6cbdd030e0c9)
182 KiB

image.pngv

<img width="1122" alt="image.png" src="attachments/908d1c5d-b66b-4aa1-bce4-79d6e8c3cd41">v
127 KiB
image.png
<img width="512" alt="image.png" src="attachments/d0516bfc-88ad-49eb-95f8-184b0506483a">
135 KiB
image.png
<img width="497" alt="image.png" src="attachments/6a310d5d-1b74-41b6-bd25-3876994b17bd">
image.png
<img width="524" alt="image.png" src="attachments/f19c916d-eaf5-40f9-9263-689c9c7cc90d">
119 KiB
{79F3202B-8810-4327-B681-E3903DBF614F}.png
<img width="607" alt="{79F3202B-8810-4327-B681-E3903DBF614F}.png" src="attachments/46e8c532-9492-437b-b805-1ba6c430e4ae">

屏幕截图 2026-09-19 165936.png[屏幕截图 2026-09-19 165936](uploading ...)

<img width="1439" alt="屏幕截图 2026-09-19 165936.png" src="attachments/592423f5-56fc-405d-85ac-d63624a91d37">[屏幕截图 2026-09-19 165936](uploading ...)
屏幕截图 2026-09-21 173955.png
<img width="1279" alt="屏幕截图 2026-09-21 173955.png" src="attachments/765386c6-7e4b-4b55-ba3d-4d8a7d4469a5">

image.png

class Animal:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return self.name

    def speak(self):
        print("...")

    def info(self):
        print("我是动物")



class Dog(Animal):
    def speak(self):
        print(f"{self.name}:汪汪!")

    def info(self):
        print("我是狗")
        super().info()

class Cat(Animal):
    def speak(self):
        print(f"{self.name}:喵喵!")

d = Dog("旺财")
c = Cat("咪咪")
d.speak()
c.speak()
print(d)
d.info()
![image.png](/attachments/fbecb79e-1558-4123-99c6-6b71cd245aa0) ```python class Animal: def __init__(self, name): self.name = name def __str__(self): return self.name def speak(self): print("...") def info(self): print("我是动物") class Dog(Animal): def speak(self): print(f"{self.name}:汪汪!") def info(self): print("我是狗") super().info() class Cat(Animal): def speak(self): print(f"{self.name}:喵喵!") d = Dog("旺财") c = Cat("咪咪") d.speak() c.speak() print(d) d.info() ```
145 KiB

image.png

![image.png](/attachments/74527bd9-3795-4d5b-924c-acf51c6bd4d3)
248 KiB

QQ_1790153470587.png

![QQ_1790153470587.png](/attachments/df974a77-f0a4-492d-af3c-c0745add5821)
image.png
<img width="1839" alt="image.png" src="attachments/9c311ee6-584e-44d6-8be6-635678dfcab4">
264 KiB
image.png
<img width="1232" alt="image.png" src="attachments/bc2538cb-cd4e-4659-90cd-e6e2508c2cbb">
389 KiB

day12完成

day12完成
image.png
<img width="355" alt="image.png" src="attachments/9fff48c7-e96b-4665-86f6-885211fcee23">
155 KiB
image.png
<img width="1152" alt="image.png" src="attachments/7bd9bce4-515d-4a29-9818-940a257e74d6">
229 KiB

`class Animal:
def init(self,name):
self.name=name
def str(self):
return self.name
def info(self):
print("我是动物")
def speak(self):
print("...")

class Dog(Animal):
def speak(self):
print(f"{self.name}:“汪汪”")
def info(self):
print("我是狗")
super().info()

class Cat(Animal):
def speak(self):
print(f"{self.name}:喵喵")

d=Dog("旺财")
c=Cat("咪咪")
d.speak()
c.speak()
print(d)
d.info()
`

`class Animal: def __init__(self,name): self.name=name def __str__(self): return self.name def info(self): print("我是动物") def speak(self): print("...") class Dog(Animal): def speak(self): print(f"{self.name}:“汪汪”") def info(self): print("我是狗") super().info() class Cat(Animal): def speak(self): print(f"{self.name}:喵喵") d=Dog("旺财") c=Cat("咪咪") d.speak() c.speak() print(d) d.info() `

image.png

![image.png](/attachments/35a77d6b-22f5-4799-a499-8e84bea4225a)
301 KiB
image.png
<img width="1280" alt="image.png" src="attachments/246a9871-4708-4604-9440-a687ead011f6">
366 KiB

image.png

![image.png](/attachments/47ccf385-fe7c-42cf-a32c-732bada60231)
289 KiB

Day_12 · 面向对象(二)继承与 str

Animal 基类 + Dog/Cat 重写 speak(),str 定制打印

day12.png

**Day_12 · 面向对象(二)继承与 __str__** Animal 基类 + Dog/Cat 重写 speak(),__str__ 定制打印 ![day12.png](https://cdn.jsdelivr.net/gh/xu675693517-hue/hello-daily-challenge@main/screenshots/day12.png)

image.png

![image.png](/attachments/a295542c-af5d-49a5-8463-2eaca53c34ce)
Sign in to join this conversation.