Skip to content

第15章:面向对象基础

15.1 面向对象的核心概念

面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它将现实世界中的事物抽象为对象,通过对象之间的交互来实现程序功能。

  • 面向对象的核心思想

    • 封装:将数据和操作数据的方法封装在一起
    • 继承:子类可以继承父类的属性和方法
    • 多态:不同对象调用同一方法,表现出不同的行为
  • 对象的概念

    • 对象是现实世界中实体的抽象,如人、汽车、动物等
    • 每个对象都有自己的属性(数据)和方法(操作)
    • 例如,"人"作为对象,有姓名、年龄等属性,会说话、走路等方法

15.2 类与对象

类(class)

类是对象的模板,定义了对象的属性和方法。类是一种抽象的概念,而对象是类的具体实例。

对象(instance)

对象是类的实例,根据类创建的具体个体。每个对象都有自己的属性值,但共享类定义的方法。

15.3 类的基础语法

类的定义

python
class 类名:
    # 类的属性
    属性1 = 值1
    属性2 = 值2
    
    # 初始化方法
    def __init__(self, 参数1, 参数2, ...):
        self.属性1 = 参数1
        self.属性2 = 参数2
    
    # 类的方法
    def 方法名(self, 参数1, 参数2, ...):
        # 方法体
        pass

初始化方法(init

__init__方法是类的特殊方法,在创建对象时自动执行,用于初始化对象的属性。

  • self是方法的第一个参数,代表对象本身
  • 通过self.属性名来访问和设置对象的属性

对象的创建与使用

python
# 创建对象
对象名 = 类名(参数1, 参数2, ...)

# 访问对象的属性
对象名.属性名

# 调用对象的方法
对象名.方法名(参数1, 参数2, ...)

示例:定义Person类

python
class Person:
    """人类"""
    # 类属性
    species = "人类"
    
    # 初始化方法
    def __init__(self, name, age):
        # 实例属性
        self.name = name
        self.age = age
    
    # 实例方法
    def speak(self):
        print(f"你好,我是{self.name},今年{self.age}岁。")
    
    def birthday(self):
        self.age += 1
        print(f"生日快乐!{self.name}现在{self.age}岁了。")

# 创建对象
person1 = Person("张三", 18)
person2 = Person("李四", 20)

# 访问属性
print(person1.name)  # 输出:张三
print(person1.age)   # 输出:18
print(Person.species)  # 输出:人类

# 调用方法
person1.speak()  # 输出:你好,我是张三,今年18岁。
person1.birthday()  # 输出:生日快乐!张三现在19岁了。
person2.speak()  # 输出:你好,我是李四,今年20岁。

15.4 面向对象的核心特性

封装

封装是将对象的属性和方法封装在一起,隐藏对象的内部细节,只提供对外的接口。

  • 私有属性:在属性名前加上双下划线__,使其成为私有属性,外部无法直接访问
  • 访问器方法:提供gettersetter方法来访问和修改私有属性
python
class Person:
    def __init__(self, name, age):
        self.name = name
        self.__age = age  # 私有属性
    
    # getter方法
    def get_age(self):
        return self.__age
    
    # setter方法
    def set_age(self, age):
        if age > 0:
            self.__age = age
        else:
            print("年龄必须大于0")

person = Person("张三", 18)
print(person.name)  # 输出:张三
# print(person.__age)  # 错误:无法直接访问私有属性
print(person.get_age())  # 输出:18
person.set_age(20)
print(person.get_age())  # 输出:20

继承

继承是子类继承父类的属性和方法,减少代码冗余,提高代码复用性。

  • 语法class 子类名(父类名):
  • 子类可以
    • 继承父类的属性和方法
    • 重写父类的方法
    • 添加新的属性和方法
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}喵喵叫")

# 创建对象
dog = Dog("旺财")
cat = Cat("汤姆")

# 调用方法
dog.speak()  # 输出:旺财汪汪叫
cat.speak()  # 输出:汤姆喵喵叫

多态

多态是不同对象调用同一方法,表现出不同的行为。

  • 多态的实现基于继承和方法重写
  • 通过父类引用指向子类对象,实现运行时的多态
python
def make_animal_speak(animal):
    """让动物发出声音"""
    animal.speak()

# 创建对象
dog = Dog("旺财")
cat = Cat("汤姆")

# 调用函数
make_animal_speak(dog)  # 输出:旺财汪汪叫
make_animal_speak(cat)  # 输出:汤姆喵喵叫

实操案例:定义Person类、Student类

案例:定义Person类、Student类

python
"""
面向对象编程示例
功能:定义Person类和Student类,演示继承和多态
"""

class Person:
    """人类"""
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def introduce(self):
        print(f"你好,我是{self.name},今年{self.age}岁。")

class Student(Person):
    """学生类"""
    def __init__(self, name, age, student_id, major):
        # 调用父类的初始化方法
        super().__init__(name, age)
        self.student_id = student_id
        self.major = major
    
    # 重写父类的方法
    def introduce(self):
        print(f"你好,我是{self.name},今年{self.age}岁,学号是{self.student_id},专业是{self.major}。")
    
    # 添加新方法
    def study(self):
        print(f"{self.name}正在学习{self.major}。")

# 创建对象
person = Person("张三", 30)
student = Student("李四", 18, "20230001", "计算机科学与技术")

# 调用方法
person.introduce()  # 输出:你好,我是张三,今年30岁。
student.introduce()  # 输出:你好,我是李四,今年18岁,学号是20230001,专业是计算机科学与技术。
student.study()  # 输出:李四正在学习计算机科学与技术。

运行结果

你好,我是张三,今年30岁。
你好,我是李四,今年18岁,学号是20230001,专业是计算机科学与技术。
李四正在学习计算机科学与技术。

新手易错点

  • __init__方法拼写错误

    • 错误拼写为__int__或其他形式
    • 正确拼写是__init__(前后各两个下划线)
  • self参数遗漏

    • 在定义方法时忘记添加self参数
    • self是方法的第一个参数,代表对象本身
  • 对象属性访问错误

    • 直接访问私有属性(以双下划线开头的属性)
    • 应该使用访问器方法(getter和setter)来访问私有属性
  • 类与对象概念混淆

    • 错误地通过类名访问实例属性
    • 实例属性应该通过对象名访问,类属性通过类名访问
  • 继承关系错误

    • 子类初始化方法中忘记调用父类的初始化方法
    • 应该使用super().__init__()来调用父类的初始化方法

通过本章的学习,你已经掌握了Python中面向对象编程的基本概念和使用方法。面向对象编程是一种重要的编程范式,它可以帮助你更好地组织和管理代码,提高代码的复用性和可维护性。在实际编程中,你会经常使用面向对象编程来构建复杂的应用程序。

© 2026 编程马·菜鸟教程 版权所有