Python基础:面向对象编程 (OOP)
继承简介
Lesson 3 of 7 • 10 XP
Keep your place in this quest
Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.
继承 是面向对象编程(OOP)的核心概念之一。
它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。
这意味着你可以在基类中定义通用的行为和数据,然后创建更专门的类来重用和定制这些功能——而无需重复编写相同的代码。
继承的基本语法
在 Python 中,通过在子类名后面的括号中指定父类名来实现继承。
class ParentClass:
# 父类的属性和方法
class ChildClass(ParentClass):
# 子类的属性和方法
````
当子类继承自父类时,它获得:
* 父类的所有**属性**(绑定到对象的变量)
* 父类的所有**方法**(绑定到对象的函数)
* 父类可能拥有的任何**构造函数**(`__init__`)
---
# 示例:动物和声音
让我们用大家都能理解的东西来展示继承——动物。
我们将从一个通用的 `Animal` 类开始,定义所有动物共有的属性,然后创建特定的动物类型(`Dog` 和 `Cat`),它们共享这些特征但发出不同的声音。
基类如下:
```python
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def sound(self):
pass # 由每种具体动物决定自己的声音
````
`Animal` 类有:
* 一个 `__init__` 方法,用于设置每个动物的 `name` 和 `age`。
* 一个 `sound()` 方法,目前不执行任何操作(`pass` 只是占位符)。
我们将在每种具体动物中替换为它们发出的声音。
---
现在我们创建两个具体的动物类:
```python
class Dog(Animal):
def sound(self):
print("Woof woof!")
class Cat(Animal):
def sound(self):
print("Meow!")
这里发生的是:
Dog和Cat都继承自Animal,因此它们自动拥有name和age属性,无需重新编写代码。- 每个类都重写了
sound()方法,发出各自独特的声音。
创建和使用对象
dog = Dog("Rex", 2)
cat = Cat("Mimi", 3)
print(dog.name) # Rex
dog.sound() # Woof woof!
print(cat.name) # Mimi
cat.sound() # Meow!
当我们创建 Dog("Rex", 2) 时,步骤如下:
- Python 调用
Animal的__init__方法(因为Dog没有自己的)。 - 我们传入的
name和age值被存储在新对象中。 - 当调用
dog.sound(),Python 先在Dog中查找sound()方法。 找到并执行我们写的这个方法——打印 "Woof woof!"。
Cat 也是同样的逻辑,但调用的是它自己的 sound() 方法。
这个例子展示了继承的魔力:
- 我们只需在
Animal类中写一次通用设置(__init__)。 - 每个子类(
Dog、Cat)保留共享特征并添加自己的独特行为。 - 结果是代码更少重复,逻辑更清晰,管理相关对象的方式也更简单。
3. 工作原理
- 共享结构:创建
Dog或Cat对象时,会运行Animal的__init__方法,因为子类自动继承它。 - 方法重写:
Dog和Cat各自有自己的sound()方法,替代了Animal中的占位实现。 调用sound()时,Python 使用子类中定义的方法,而非父类中的。
提示:如果子类没有重写某个方法,它会自动使用父类的实现。
为什么要使用继承?
继承让你:
- 通过将共享逻辑放在单一基类中,避免重复代码。
- 提高代码的模块化和可读性。
- 从通用蓝图构建专门的类。
思考继承的例子:
Animal→ 通用蓝图,包含name、age和一个sound()方法。Dog→ 一种特定动物,有自己独特的叫声。Cat→ 另一种特定动物,发出不同的叫声。
总结
继承是面向对象编程中用于创建类层次结构的强大工具,从通用概念出发,逐步走向更专门的类。
在 Python 中,实现方式是:
- 编写含有通用属性和方法的父类。
- 创建在括号中列出父类名称的子类。
- 根据需要在子类中添加或重写方法。
下一课中,我们将继续探讨 super() —— 一种让子类调用并扩展父类行为的方法。