【Python 入门】面向对象基础:类、对象、成员变量与构造方法

文章目录

前言

面向对象是 Python 编程的核心思想之一,它模拟现实世界的事物描述方式,将属性(数据)行为(功能) 封装到类中,通过创建对象来完成业务逻辑。本文从最基础的类定义、对象创建讲起,带你掌握成员变量、成员方法、self 关键字与构造方法,夯实面向对象入门基础。

一、面向对象思想入门

在程序中记录数据,如果只用字典、列表等基础结构,数据和行为是分离的,不仅写法混乱,也难以复用。面向对象的思路和现实生活一致:

  1. 设计表格(类):先定义好模板,规定要记录哪些信息、具备哪些功能
  2. 打印表格(创建对象):基于模板生成一个个独立的实体
  3. 填写表格(属性赋值):给每个实体填充专属数据

简单总结:类是设计图纸,对象是基于图纸生产的实体,一个类可以生成无数个对象,每个对象拥有独立的数据。

二、类的定义:成员变量与成员方法

2.1 基础语法

Python 中使用 class 关键字定义类,类由两部分组成:

  • 成员变量(属性):类中定义的变量,用于存储数据
  • 成员方法(行为):类中定义的函数,用于实现功能

语法格式:

python 复制代码
class 类名:
    # 成员变量
    变量名 = 值
    
    # 成员方法
    def 方法名(self, 形参1, 形参2...):
        方法体

2.2 self 关键字详解

成员方法的第一个参数必须是 self,这是 Python 面向对象的核心规则:

  1. self 代表当前对象自身
  2. 调用方法时 self 会由 Python 自动传入,无需手动传参
  3. 在方法内部访问成员变量,必须通过 self.变量名 的方式

补充说明:self 只是约定俗成的命名,你可以改成其他名称,但行业通用 self,不建议修改。

2.3 完整示例:学生类

python 复制代码
class Student:
    # 成员方法
    def say_hi(self):
        print(f"大家好,我叫{self.name}")

    def say_hi2(self):
        # 修复了原代码中括号位置错误的语法问题
        print(f"大家好,我是:{self.name},正在学习Python")

# 创建两个独立的对象
stu1 = Student()
stu1.name = "张三"
stu1.say_hi()

stu2 = Student()
stu2.name = "王五"
stu2.say_hi2()

运行结果:

text 复制代码
大家好,我叫张三
大家好,我是:王五,正在学习Python

三、类与对象的示例:闹钟类

我们用一个更贴近现实的案例,理解 "一个类生成多个对象" 的逻辑:

python 复制代码
class Clock:
    # 成员变量
    id = None       # 序列号
    price = None    # 价格

    # 成员方法:响铃
    def ring(self):
        import winsound
        # 参数:频率(赫兹)、持续时间(毫秒)
        winsound.Beep(2000, 3000)
        print("闹钟正在响铃!")

# 创建第一个闹钟对象
clock1 = Clock()
clock1.id = "10001"
clock1.price = 9.99
print(f"闹钟1序列号:{clock1.id},价格:{clock1.price}")
clock1.ring()

# 创建第二个闹钟对象
clock2 = Clock()
clock2.id = "10002"
clock2.price = 19.99
print(f"闹钟2序列号:{clock2.id},价格:{clock2.price}")
clock2.ring()

易错提醒:winsoundWindows 系统专属模块,Linux/macOS 环境无法运行,跨平台场景建议替换为打印提示或其他音频库。

四、构造方法 __init__

4.1 为什么需要构造方法

上面的代码中,我们需要手动逐个给属性赋值,当属性很多时代码非常繁琐。Python 提供了 __init__ 构造方法:

  • 创建对象时自动执行
  • 可以接收参数,自动给对象属性赋值
  • 方法名前后必须各有两个下划线,属于魔术方法的一种

4.2 基础用法

python 复制代码
class Student:
    # 构造方法:创建对象时自动调用
    def __init__(self, name, age, tel):
        self.name = name    # 给当前对象的name属性赋值
        self.age = age
        self.tel = tel
        print("Student对象创建成功!")

# 创建对象时直接传参,自动完成属性赋值
stu = Student("张三", 22, "1008611")
print(stu.name)
print(stu.age)
print(stu.tel)

4.3 注意事项

  1. 构造方法也是成员方法,第一个参数必须是 self
  2. 无需提前在类中声明成员变量,在 __init__ 中通过 self.xxx 赋值即可自动创建实例属性
  3. 类中定义的 name = None类属性 (所有对象共享),self.name实例属性(每个对象独有),注意区分

五、入门易错点总结

  1. 忘记写 self :成员方法第一个参数必须加 self,否则调用时会报错TypeError
  2. 方法内访问属性不加 self :直接写 name 会被识别为局部变量,必须写 self.name
  3. 构造方法拼写错误 :是 __init__(两个下划线),不是 _init_init
  4. 对象创建语法对象名 = 类名(),括号不能丢,否则拿到的是类本身而非对象

六、总结

  • 面向对象核心:类是模板,对象是实体,一个类可生成多个对象
  • 类 = 成员变量(存数据) + 成员方法(实现功能)
  • self 代表当前对象自身,是方法的第一个参数,调用时自动传入
  • __init__ 构造方法用于对象初始化,创建对象时自动执行,可快速赋值属性
相关推荐
用户298698530149 分钟前
Python 将 HTML 转换为 Word 文档的实践指南
python·html·api
维克兜率天11 分钟前
【维克】模块3总结:从一行空数据,到一个能跑的模型
python·深度学习·算法
飞Link15 分钟前
定积分理论与 Python 仿真完全指南
python·算法
小静AI工程实验室22 分钟前
Python 爬虫翻页为何重复、漏数据?SQLite 复现 OFFSET、复合游标与快照的 8 项检查
爬虫·python·sqlite
ocean210323 分钟前
2025-2026年C++专题大厂面试高频问题
开发语言·c++·面试
夜雪一千30 分钟前
如何使用Python实现音频转文本(ASR语音识别)
python
白远山30 分钟前
健身场馆无人自动化系统实战指南:从架构设计到部署全流程解析
java·开发语言·架构·需求分析
SunnyDays10111 小时前
使用 Python 将 PowerPoint 转换为视频(无需安装 Microsoft PowerPoint)
python·powerpoint·ppt 转 动画·ppt 转 mp4·ppt 转 wmv·幻灯片转动画·幻灯片转 mp4
飞Link1 小时前
零基础:离散数据积分与 Python 实现保姆级教程
python·算法
郝学胜-神的一滴1 小时前
C++20模板元编程 02:吃透模板基础核心四大核心知识点
开发语言·数据结构·c++·程序人生·软件工程·visual studio