【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__ 构造方法用于对象初始化,创建对象时自动执行,可快速赋值属性
相关推荐
招财小梗1 小时前
沈阳商贸公司AI企业服务优势几何?
大数据·人工智能·python
liangshanbo12152 小时前
虚拟列表深度面试题整理
java·开发语言·前端
ZISHU_9872 小时前
用 TLabel 给 SynTouch BioTac 数据做语义标注:从原始信号到结构化标注
开发语言·人工智能·python·数据·机器人触觉
略略略咯咯2 小时前
C#Unity
开发语言·unity·c#
gugucoding2 小时前
59. 【Java】Spring Boot 入门:第一个 Web 应用
java·开发语言·spring boot
lilian2333 小时前
Harmony os 技术实战|拼豆制图43:压缩字符矩阵上线前如何拦住错位图纸
开发语言·前端·华为·矩阵·harmonyos
进击ing小白3 小时前
Qt 无边框窗口进阶指南
开发语言·qt
m0_617493943 小时前
SSLError [ASN1: NOT_ENOUGH_DATA] 问题排查与解决指南
python·ssl
点我头像干啥3 小时前
004:多个PDF文件合并
开发语言·pdf·php