首页...面向对象编程——类与对象的定义与使用
Python程序设计第九章 面向对象编程/第二节

面向对象编程——类与对象的定义与使用

2026-03-24

第九章 面向对象编程

第二节 类与对象的定义与使用

概述

本节主要讲解面向对象编程(OOP)中最核心的概念——类与对象。学习目标包括:理解类和对象的基本概念,掌握如何定义类和创建对象,理解类的属性和方法,掌握对象的使用和操作,能够通过实例应用面向对象编程思想解决实际问题。通过本节的学习,考生将能够熟练运用Python的类与对象,打下坚实的面向对象编程基础,为后续章节学习继承、多态等高级特性做好准备。


核心概念

  • 类(Class):类是具有相同属性和方法的对象的集合,是对一类事物的抽象描述。简单来说,类是创建对象的模板或蓝图。

  • 对象(Object):对象是类的实例,是类的具体表现。每个对象都拥有类中定义的属性和方法。

  • 属性(Attribute):属性是类或对象的变量,用来描述对象的状态或特征。

  • 方法(Method):方法是定义在类中的函数,用来描述对象的行为。

  • 实例化(Instantiation):通过类创建对象的过程称为实例化。

  • 构造方法(init):特殊方法,用于在创建对象时初始化对象的属性。

  • self参数:指向当前对象的引用,是访问对象属性和方法的桥梁。


原理分析

面向对象编程通过将数据和操作数据的代码封装在一起,实现了数据抽象和封装。类作为抽象模板,定义了对象的属性和行为,而对象则是类的具体实例,每个对象拥有独立的状态。

Python类的定义本质上是一个特殊的对象,类中定义的属性和方法最终绑定到类的命名空间中。实例化时,Python会调用构造方法__init__,为对象分配内存空间并初始化属性。

在方法定义中,self参数自动传递当前对象引用,使得方法可以访问和修改对象的属性。通过self,类内部的代码可以区分不同对象的状态。

面向对象的核心优势是:

  • 封装:将数据和操作封装在类中,提升代码组织性和安全性。
  • 复用性:通过类和对象复用代码,避免重复。
  • 易维护性:结构清晰,便于管理和扩展。

详细内容

1. Python中类的定义

在Python中,使用关键字class定义类,格式如下:

class 类名:
    # 属性和方法

类名通常采用首字母大写的驼峰命名法。类体中可以定义属性和方法。

示例:

class Person:
    pass  # 空类

2. 创建对象(实例化)

通过类名加括号即可实例化对象:

p1 = Person()

此时p1就是Person类的一个对象。

3. 属性的定义与使用

属性通常在构造方法中定义,构造方法是一个特殊的方法,名称为__init__,在创建对象时自动调用。

class Person:
    def __init__(self, name, age):
        self.name = name  # 实例属性
        self.age = age

p1 = Person("张三", 20)
print(p1.name)  # 张三

self.name和self.age是对象p1的实例属性,可以通过对象访问。

4. 方法的定义与调用

方法定义类似于函数,但第一个参数必须是self,表示调用该方法的对象。方法通过self访问对象属性。

class Person:
    def __init__(self, name):
        self.name = name
    def say_hello(self):
        print(f"大家好,我是{self.name}")

p1 = Person("李四")
p1.say_hello()  # 大家好,我是李四

5. 实例属性与类属性

  • 实例属性:属于对象,每个对象的实例属性互不影响。
  • 类属性:属于类,所有对象共享同一个类属性。
class Person:
    species = "人类"  # 类属性
    def __init__(self, name):
        self.name = name  # 实例属性

p1 = Person("张三")
p2 = Person("李四")
print(p1.species)  # 人类
print(p2.species)  # 人类

Person.species = "智人"
print(p1.species)  # 智人

6. 私有属性与封装

Python中通过双下划线(__)将属性定义为私有,外部无法直接访问,只能通过方法访问,实现封装。

class Person:
    def __init__(self, name, age):
        self.__name = name  # 私有属性
        self.__age = age
    def get_name(self):
        return self.__name
    def set_age(self, age):
        if age > 0:
            self.__age = age
        else:
            print("年龄必须为正数")

p = Person("王五", 30)
print(p.get_name())  # 王五
p.set_age(-5)  # 年龄必须为正数

通过私有属性和getter/setter方法,保护数据安全,提高代码健壮性。

7. 对象的内存地址和标识

通过函数id()可以查看对象的唯一标识,使用is操作符判断两个对象是否是同一个。

p1 = Person("张三")
p2 = Person("张三")
print(id(p1), id(p2))
print(p1 is p2)  # False

实例分析

案例一:学生信息管理类

背景:设计一个学生类,包含学生姓名、年龄、成绩等属性,以及打印学生信息的方法。

class Student:
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score
    def show_info(self):
        print(f"学生姓名:{self.name}")
        print(f"年龄:{self.age}")
        print(f"成绩:{self.score}")

stu1 = Student("小明", 18, 90)
stu1.show_info()

分析

  • 通过__init__方法初始化属性。
  • 定义show_info方法显示信息。
  • 实例化对象并调用方法。

结论:类封装了学生的属性和行为,方便管理学生信息。

案例二:银行账户类

背景:设计一个银行账户类,包含账户名、余额属性,提供存款、取款方法。

class BankAccount:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self.balance = balance
    def deposit(self, amount):
        if amount > 0:
            self.balance += amount
            print(f"存款成功,余额:{self.balance}")
        else:
            print("金额必须为正数")
    def withdraw(self, amount):
        if 0 < amount <= self.balance:
            self.balance -= amount
            print(f"取款成功,余额:{self.balance}")
        else:
            print("余额不足或金额错误")

acc = BankAccount("张三", 1000)
acc.deposit(500)
acc.withdraw(2000)

分析

  • 使用构造方法初始化账户信息。
  • 提供存取款操作,并检查金额有效性。

结论:通过对象对账户状态进行封装,模拟真实账户行为。

案例三:汽车类

背景:设计一个汽车类,包含车牌号、颜色属性,提供启动和停止方法。

class Car:
    def __init__(self, plate, color):
        self.plate = plate
        self.color = color
    def start(self):
        print(f"汽车{self.plate}启动了")
    def stop(self):
        print(f"汽车{self.plate}停止了")

car1 = Car("京A12345", "红色")
car1.start()
car1.stop()

分析

  • 车牌号和颜色是属性,启动和停止是行为。
  • 通过对象调用方法,完成汽车操作模拟。

结论:面向对象设计符合实际事物的抽象和建模。


常见误区

  1. 混淆类和对象的概念

    • 错误:将类当成对象使用。
    • 正确:类是模板,对象是实例,必须先定义类再创建对象。
  2. 忘记在方法定义中添加self参数

    • 错误:方法缺少self,会导致调用错误。
    • 正确:所有实例方法第一个参数必须是self。
  3. 直接访问私有属性

    • 错误:外部直接访问__开头的属性,导致访问失败。
    • 正确:通过getter/setter方法访问私有属性。
  4. 混用类属性和实例属性

    • 错误:修改类属性时误以为只影响一个对象。
    • 正确:理解类属性是共享的,实例属性是独立的。
  5. 构造方法写错名称或参数不匹配

    • 错误:写成_init_或参数缺失。
    • 正确:构造方法必须写成__init__(self, ...),且实例化时传参应匹配。

应用场景

  • 软件开发中的数据模型设计:通过类定义业务实体,如学生、员工、订单等,封装属性和行为。

  • 游戏开发:设计角色、道具、场景等对象,实现丰富交互和状态管理。

  • 图形界面编程:窗口、按钮、文本框等控件均用类和对象组织。

  • 金融系统:账户、交易等用类封装,保证数据安全和操作规范。

  • 自动化脚本:将复杂操作封装在类中,提升代码重用性和可维护性。


知识拓展

  • 继承与派生类:在本节掌握类和对象基础上,继承实现代码复用和功能扩展。

  • 多态:通过父类引用指向子类对象,调用同名方法体现不同表现。

  • 封装的高级用法:属性装饰器@property实现属性访问控制。

  • 类的特殊方法:如__str__、repr、__del__等,用于对象输出和生命周期管理。

  • 元类和类装饰器:控制类的创建和行为,提升面向对象编程的灵活性。


总结回顾

本节系统讲解了Python面向对象编程的核心——类与对象。重点包括:

  • 类是对象的模板,对象是类的实例。
  • 使用class定义类,使用__init__方法初始化对象属性。
  • self参数表示当前对象,用于访问属性和方法。
  • 属性分为实例属性和类属性,理解两者区别及使用场景。
  • 方法定义必须包含self,实现对象行为。
  • 封装通过私有属性和getter/setter保护数据。
  • 通过典型案例演示如何设计和实现类。
  • 识别并避免常见错误,掌握正确的类与对象使用方法。
  • 理解类与对象在实际应用中的重要作用。

掌握本节内容是学习面向对象编程的基础,为后续学习继承、多态等高级特性打下坚实基础。建议考生通过多写代码练习,加深理解,熟练应用类与对象的定义和使用。


重点知识点

1

类是对象的模板,定义对象的属性和方法

2

对象是类的实例,拥有独立的属性和行为

3

self参数代表当前对象,方法定义中必须包含

4

构造方法__init__用于初始化对象属性

5

实例属性和类属性的区别和使用

6

私有属性实现封装,保护数据安全

7

通过类实例化创建对象,调用属性和方法

8

常见误区包括忘写self、混淆类和对象等

9

典型应用场景包括数据模型设计、游戏开发等

10

掌握类与对象为后续继承、多态学习奠定基础