在 Python 里,你之前学的变量、列表、字典,都属于数据;函数属于行为。而对象(Object) 就是把数据 + 行为打包在一起的东西。
面向对象编程(OOP)是现代编程最重要的思想之一,它让代码更清晰、更好复用、更容易维护。不管是做游戏、网站、数据分析还是自动化,都离不开对象。
这篇教程从最基础讲起,不讲复杂术语,让你真正学会 Python 类、对象、属性、方法、继承、封装。
一、什么是对象?什么是类?
1. 直观理解
- 类(Class):相当于设计图纸 / 模板。比如 “学生”“手机”“汽车” 是一类东西。
- 对象(Object):根据图纸造出来的具体实例。比如 “张三同学”“你的手机”“楼下那辆特斯拉”。
一句话:
类是模板,对象是根据模板造出来的具体东西。
2. 生活中的例子
- 类:手机
- 属性:品牌、颜色、内存
- 方法:打电话、发微信、拍照
- 对象:你的手机
- 品牌 = 华为
- 颜色 = 白色
- 可以执行打电话 ()
3. 程序里的结构
plaintext
类(Class) ├── 属性(变量):存储数据 └── 方法(函数):执行操作
二、定义一个最简单的类
用 class 关键字定义类,类名一般用大驼峰(每个单词首字母大写)。
python
运行
class Student: pass
pass 表示空类,什么都不做。
然后根据这个类创建对象(实例化):
python
运行
# 创建对象 s1 s1 = Student() # 创建对象 s2 s2 = Student() print(s1) print(s2)
你会发现 s1 和 s2 是两个不同的对象,互不干扰。
三、构造方法 __init__:给对象初始化数据
创建对象时自动执行的方法叫构造方法,固定名字:__init__(前后两个下划线)。
它的作用是:给对象设置初始属性。
python
运行
class Student: # 构造方法 def __init__(self, name, age, grade): # self 代表当前对象自己 self.name = name # 属性:姓名 self.age = age # 属性:年龄 self.grade = grade # 属性:年级
重点:self 是什么?
self必须写在方法的第一个参数- 它代表当前这个对象自己
- 每个对象调用方法时,self 自动传进去,不用你管
创建带属性的对象
python
运行
s1 = Student("张三", 16, "高一") s2 = Student("李四", 15, "高一") print(s1.name) # 张三 print(s1.age) # 16 print(s2.grade) # 高一
每个对象都有独立的属性,互不影响。
四、在类里写方法(对象的行为)
方法就是类里面的函数,表示对象能做什么。
python
运行
class Student: def __init__(self, name, age): self.name = name self.age = age # 方法1:介绍自己 def introduce(self): print(f"我叫{self.name},今年{self.age}岁") # 方法2:学习 def study(self, subject): print(f"{self.name}正在学习{subject}")
使用:
python
运行
s = Student("小明", 14) s.introduce() s.study("数学")
输出:
plaintext
我叫小明,今年14岁 小明正在学习数学
这就是数据 + 行为打包成对象。
五、修改、访问、删除对象属性
1. 访问属性
python
运行
print(s.name) print(s.age)
2. 修改属性
python
运行
s.age = 15 s.name = "大明"
3. 动态添加属性
Python 非常灵活,可以随时给对象加属性:
python
运行
s.score = 90 print(s.score)
4. 删除属性
python
运行
del s.score
5. 判断是否有属性
python
运行
print(hasattr(s, "name")) # True print(hasattr(s, "score")) # False
六、三大特性之一:封装
封装 = 把数据保护起来,不让外部随便改。
比如学生的分数不能随便改成 100,必须通过正规方法修改。
Python 用下划线约定表示私有:
_xxx:保护属性(约定不建议外部访问)__xxx:私有属性(外部很难直接访问)
示例:
python
运行
class Student: def __init__(self, name): self.name = name self.__score = 0 # 私有属性 # 提供方法设置分数 def set_score(self, score): if 0 <= score <= 100: self.__score = score else: print("分数无效") def get_score(self): return self.__score
使用:
python
运行
s = Student("小红") s.set_score(88) print(s.get_score()) # 88 s.set_score(150) # 分数无效
好处:
- 外部不能随便乱改
- 可以加验证逻辑
- 代码更安全、更规范
七、三大特性之二:继承
继承 = 子类复用父类的功能,并扩展新功能。
比如:
- 父类:人类(Person)
- 属性:姓名、年龄
- 方法:说话、吃饭
- 子类:学生(Student)继承人类
- 额外属性:学号
- 额外方法:学习
语法:
python
运行
class Person: def __init__(self, name, age): self.name = name self.age = age def say(self): print(f"我是{self.name}") # Student 继承 Person class Student(Person): def __init__(self, name, age, student_id): # 调用父类构造方法 super().__init__(name, age) self.student_id = student_id # 子类自己的属性 def study(self): print(f"{self.name}学习中")
使用:
python
运行
s = Student("小明", 15, "S1001") s.say() # 继承自父类 s.study() # 子类自己的
继承的好处:
- 代码不用重复写
- 结构清晰
- 方便扩展
八、三大特性之三:多态
多态就是:同一个方法名,不同子类可以有不同实现。
示例:
python
运行
class Animal: def speak(self): pass class Dog(Animal): def speak(self): print("汪汪汪") class Cat(Animal): def speak(self): print("喵喵喵")
统一调用:
python
运行
def make_sound(animal): animal.speak() dog = Dog() cat = Cat() make_sound(dog) # 汪汪汪 make_sound(cat) # 喵喵喵
这就是多态:同样调用 speak(),表现不同。
九、常用内置方法(魔术方法)
以 __xx__ 命名的方法叫魔术方法,系统自动调用。
1. __str__:打印对象时显示内容
python
运行
class Student: def __init__(self, name): self.name = name def __str__(self): return f"学生:{self.name}" s = Student("小明") print(s) # 学生:小明
2. __len__:让对象可以用 len ()
python
运行
class Classroom: def __init__(self): self.students = [] def add(self, s): self.students.append(s) def __len__(self): return len(self.students) c = Classroom() c.add("小明") c.add("小红") print(len(c)) # 2
3. __del__:对象销毁时调用
python
运行
def __del__(self): print("对象被销毁了")
十、类属性、实例属性、类方法、静态方法
1. 实例属性
每个对象自己的:self.name
2. 类属性
所有对象共享:
python
运行
class Student: school = "第一中学" # 类属性 s1 = Student() s2 = Student() print(s1.school) # 第一中学 print(s2.school)
3. 类方法 @classmethod
操作类属性:
python
运行
@classmethod def set_school(cls, name): cls.school = name
4. 静态方法 @staticmethod
和对象无关,只是放在类里的工具函数:
python
运行
@staticmethod def add(a, b): return a + b
十一、面向对象的优点总结
- 代码复用:继承避免重复
- 结构清晰:数据和行为打包
- 易于扩展:加功能不影响原有代码
- 安全可控:封装保护数据
- 符合现实逻辑:人、车、手机、学生都能直接映射成对象
十二、完整综合示例
python
运行
class Phone: def __init__(self, brand, color): self.brand = brand self.color = color def call(self, name): print(f"{self.color}的{self.brand}手机给{name}打电话") class SmartPhone(Phone): def __init__(self, brand, color, system): super().__init__(brand, color) self.system = system def play_game(self): print(f"{self.brand}手机玩游戏,系统是{self.system}") p = SmartPhone("iPhone", "白色", "iOS") p.call("妈妈") p.play_game()
输出:
plaintext
白色的iPhone手机给妈妈打电话 iPhone手机玩游戏,系统是iOS
十三、新手常见误区
- 忘记写 self
方法第一个参数必须是 self,否则报错。 - 把类当对象直接用
python
运行
Student.name # 错 s = Student() s.name # 对
- 以为继承会自动调用父类 init
必须写super().__init__(...) - 随便修改私有属性
虽然 Python 不强制禁止,但规范上不要直接改__xxx
总结(极简版)
- 类(Class):模板
- 对象(Object):具体实例
- 属性:变量,存储数据
- 方法:函数,行为
- 封装:保护数据,提供接口
- 继承:代码复用
- 多态:同一方法不同表现
学会这些,你已经掌握 Python 面向对象 90% 的常用内容,可以看懂绝大多数项目代码。