跳到主要内容

Python 中文面向对象编程教程

本教程专为中文语境下的 Python 开发者打造,结合中文术语讲解与智能代码翻译,逐步引导你掌握 Python 的面向对象编程(Object-Oriented Programming, 简称 OOP)核心概念。


引入:为什么需要类?

在没有类的情况下,程序往往是“面向过程编程”的 —— 也就是说,程序由一组函数和变量组成,数据和操作是分离的。这种方式在程序规模小时很好用,但当程序越来越大时,会出现很多问题:

1. 代码重复,难以复用

例如我们想描述多个学生的信息(姓名、年龄、成绩),如果用函数和变量来组织,就会写很多重复的代码,且难以维护。

学生1_姓名 = "小明"
学生1_年龄 = 15
学生1_成绩 = 90

学生2_姓名 = "小红"
学生2_年龄 = 16
学生2_成绩 = 92

打印学生(姓名, 年龄, 成绩):
打印(f"{姓名}{年龄}岁,成绩{成绩}分")

2. 数据与操作分离,不利于封装与维护

所有数据都是全局变量或函数参数,很容易被其他函数错误修改,程序不安全、不模块化。

3. 无法体现“对象”的逻辑结构

我们希望“学生”不仅有属性(名字、年龄),还应该有行为(比如参加考试、计算平均分)。但面向过程的函数是与“谁”没有关系的。


✅ 面向对象编程如何解决这些问题?

Python 提供的类(类别)机制,可以把属性(数据)和方法(操作)组合在一起形成一个对象。也就是说,我们可以通过“对象”来封装数据和行为。

面向对象的优势:

问题解决方案
代码冗余、难维护使用类别可以复用代码,减少重复
数据与函数分离类别将数据和方法绑定在一起,封装性强
缺乏结构类别通过对象来模拟真实世界,更接近人类思维
代码组织混乱类别可以分层抽象,支持继承、模块化

对比示例(简化版)

学生:
初始化(自身, 姓名, 年龄, 成绩):
自身.姓名 = 姓名
自身.年龄 = 年龄
自身.成绩 = 成绩

打印信息(自身):
打印(f"{自身.姓名}{自身.年龄}岁,成绩{自身.成绩}分")

学生1 = 学生("小明", 15, 90)
学生2 = 学生("小红", 16, 92)

学生1.打印信息()
学生2.打印信息()

🧠 总结:类的作用

  • 类提供了一种封装机制,把数据和方法组织成一体
  • 类帮助我们模拟现实世界的对象结构(比如“学生”就是一个对象)
  • 类让程序更模块化、可复用、易扩展
  • 类是实现面向对象编程的基础,构建大型系统时必不可少

一、什么是类(Class)

类是对一组具有相同特征(属性)和行为(方法)对象的抽象。类是创建对象的模板,就像图纸是建造房屋的蓝本。

在 Python 中,使用 class 关键字定义类。类中可以包含属性(用于描述对象的状态)和方法(用于定义对象的行为)。

人类:
"""描述一个人的类"""
名字 = "张三"

打招呼(self):
返回 "你好,我是" + self.名字

二、什么是对象(Object)

对象是类的实例。类只是一个模板,必须实例化(创建)成对象后,才能使用。

每次实例化类都会生成一个独立的对象,它拥有类中定义的属性和方法。

我的人 = 人类()
打印(我的人.名字)
打印(我的人.打招呼())

三、类属性与实例属性

  • 类属性:定义在类内部、方法之外,属于整个类共享的变量。
  • 实例属性:定义在方法中,通过 self 引用,属于具体对象。

每个对象可以拥有独立的实例属性,但类属性在所有对象中共享。

动物:
类别 = "哺乳动物"

初始化(self, 名字):
self.名字 = 名字

我的猫 = 动物("花花")
打印(我的猫.名字)
打印(我的猫.类别)

四、构造方法(init

构造方法 __init__ 是 Python 中用于在创建对象时自动调用的方法,用来初始化对象的属性。

这个方法类似于其它语言中的构造函数,例如 Java 中的 constructor

用户:
初始化(self, 用户名):
self.用户名 = 用户名

新用户 = 用户("admin")
打印(新用户.用户名)

五、self 的作用

在类的方法中,self 代表当前类的实例对象。通过它我们可以访问实例的属性和方法。

虽然可以使用其他名称代替 self,但按照 Python 约定,建议始终使用 self 以提高代码可读性。

示例:
显示自身(self):
打印(self)
打印(self.__类__)

示例对象 = 示例()
示例对象.显示自身()

六、类的方法类型

在 Python 中,类可以包含三种主要类型的方法:

1. 实例方法(普通方法)

最常用的方法类型,第一个参数为 self,表示当前实例对象。它可以访问和修改实例属性。

账户:
__初始化__(self, 名字):
self.名字 = 名字

显示名称(self):
打印("账户名:", self.名字)

a = 账户("小李")
a.显示名称()

2. 类方法(Class Method)

使用装饰器 @classmethod 定义,第一个参数为 cls,代表类本身。可用于访问类变量或创建类相关操作。

工厂:
类变量 = "这是类方法"

@类方法
显示信息(cls):
打印("类变量值为:", cls.类变量)

工厂.显示信息()

3. 静态方法(Static Method)

使用装饰器 @staticmethod 定义,不自动传入 selfcls 参数,类似普通函数,但放在类中。适合封装一些与类相关但不依赖类或对象状态的功能。

数学:
@静态方法
求和(a, b):
返回 a + b

打印(数学.求和(3, 5))

4. 常用特殊方法

Python 提供了一些以双下划线开头和结尾的特殊方法,可以赋予类特殊的行为。


__init__ 构造方法

当创建类实例时自动调用,用于初始化属性。

学生:
__初始化__(自身, 姓名, 年龄):
自身.姓名 = 姓名
自身.年龄 = 年龄

学生1 = 学生("小明", 15)
打印(学生1.姓名, 学生1.年龄) # 输出 小明 15

__str__ 方法

定义实例通过 打印() 输出时的字符串表现。

人员:
__初始化__(自身, 姓名):
自身.姓名 = 姓名

__字符串__(自身):
返回 f"人: {自身.姓名}"

人员1 = 人员("小明")
打印(人员1) # 输出: 人员: 小明

__repr__ 方法

返回对象的“官方”字符串,通常用于调试。

人员:
__初始化__(自身, 姓名):
自身.姓名 = 姓名

__代表__(自身):
返回 f"人员('{自身.姓名}')"

人员1 = 人员("小明")
打印(代表(人员1)) # 输出: 人员('小明')

__del__ 析构方法

对象被销毁时调用,通常用于清理资源。

文件管理器:
__初始化__(自身, 文件名):
自身.文件名 = 文件名
打印(f"打开文件 {自身.文件名}")

__删除__(自身):
打印(f"关闭文件 {自身.文件名}")

f = 文件管理器("test.txt")
# 当 f 被销毁时,自动调用 析构

__call__ 方法

使类实例可以像函数一样被调用。

计数器:
__初始化__(自身):
自身.计数 = 0

__调用__(自身):
自身.计数 += 1
打印(f"调用次数: {自身.计数}")

c = 计数器()
c()
c()

  • 类方法、静态方法和普通方法的区别在于第一个参数及调用方式。
  • 魔法方法如 __init____str____repr__ 等为类提供了灵活的扩展能力。
  • 了解和合理使用魔法方法,能够让你的类更加 Pythonic,行为更加符合预期。

如果需要,我可以帮你继续整合其他章节或生成完整版本。你觉得如何?

总结:面向对象编程核心要点

  1. 类(Class):抽象对象的模板,用 class 定义。
  2. 对象(Object):类的具体实例,可拥有自己的属性和方法。
  3. 构造函数(init:用于初始化对象。
  4. self:当前对象的引用,用于访问实例属性和方法。
  5. 类属性与实例属性:类属性共享,实例属性独立。
  6. 方法分类:包括实例方法、类方法、静态方法,各自使用不同的语义和用途。

掌握上述六点,已为深入理解 Python 面向对象编程奠定扎实基础。