类(Class)是 Python 面向对象编程(OOP)的核心,类 = 属性 + 方法。用最通俗的话说:类是 "设计图纸",对象是 "按图纸造出来的具体产品"。
一、先搞懂最核心的关系
- 类(图纸):抽象的模板,定义了一类事物共有的特征和能做的事
- 对象(汽车):根据图纸造出来的具体实例,每个对象都有自己的独特属性
- 例子:
- 类:人类 → 对象:你、我、张三
- 类:手机 → 对象:你的 iPhone、我的华为
- 类:汽车 → 对象:红色的特斯拉、黑色的奔驰
二、最简单的类:定义一辆 "基础汽车"
# 定义类(画图纸),类名首字母大写(行业规范) class Car: # 1. 属性:描述事物的特征(变量) brand = "未知品牌" # 品牌 color = "白色" # 颜色 speed = 0 # 当前速度 # 2. 方法:描述事物能做的事(函数) def run(self): self.speed += 20 print(f"汽车启动,当前速度:{self.speed}km/h") def stop(self): self.speed = 0 print("汽车停下了") # 实例化(造车):根据图纸造一辆具体的车 my_car = Car() # 使用对象:调用属性和方法 print(my_car.color) # 输出:白色 my_car.run() # 输出:汽车启动,当前速度:20km/h my_car.stop() # 输出:汽车停下了关键知识点:self是什么?
self是当前对象自己的代名词,就像 "我"。
- 类里的所有方法,第一个参数必须是
self(名字可以改,但行业默认用 self) - 调用方法时,不需要手动传
self,Python 会自动把当前对象传进去 - 用
self.属性名可以访问当前对象的属性
三、构造函数:造车时就定制属性
上面的车出厂都是白色、未知品牌,很不灵活。用 ** 构造函数__init__** 可以在造车时就指定属性:
class Car: # 构造函数:创建对象时自动执行,专门用来初始化属性 def __init__(self, brand, color, max_speed=180): # 实例属性:每个对象自己独有的属性 self.brand = brand # 传入的品牌赋值给当前对象的brand self.color = color # 传入的颜色赋值给当前对象的color self.max_speed = max_speed # 最高速度,有默认值 self.speed = 0 # 初始速度都是0 def run(self): if self.speed < self.max_speed: self.speed += 30 print(f"{self.color}的{self.brand}加速到{self.speed}km/h") else: print(f"已经到最高速度{self.max_speed}km/h,不能再快了!") # 造三辆不同的车 tesla = Car("特斯拉", "红色") benz = Car("奔驰", "黑色", 220) bmw = Car("宝马", "蓝色") # 每辆车的属性都是独立的 print(tesla.color) # 红色 print(benz.max_speed) # 220 tesla.run() # 红色的特斯拉加速到30km/h benz.run() # 黑色的奔驰加速到30km/h四、实例属性 vs 类属性
1. 实例属性(刚才讲的)
- 属于单个对象,每个对象的值可以不同
- 定义在
__init__里,用self.访问 - 例子:每辆车的颜色、品牌
2. 类属性
- 属于整个类,所有对象共享同一个值
- 定义在类内部、方法外部
- 例子:所有汽车都有 4 个轮子
class Car: # 类属性:所有汽车共享 wheels = 4 def __init__(self, brand, color): self.brand = brand self.color = color # 类属性可以通过类名或对象访问 print(Car.wheels) # 4 print(Car("特斯拉", "红色").wheels) # 4 # 修改类属性,所有对象都会受影响 Car.wheels = 6 print(Car("奔驰", "黑色").wheels) # 6五、继承:"儿子" 继承 "爸爸" 的本事
继承就是子类复用父类的所有属性和方法,还能添加自己独有的功能。就像:
- 父类:汽车 → 子类:SUV、跑车、卡车
- 父类:人类 → 子类:学生、老师、医生
# 父类(基类):汽车 class Car: def __init__(self, brand, color): self.brand = brand self.color = color self.speed = 0 def run(self): self.speed += 30 print(f"{self.color}的{self.brand}在公路上行驶,速度{self.speed}km/h") # 子类(派生类):SUV,继承自Car class SUV(Car): # 子类独有的属性和方法 def __init__(self, brand, color, seat_count=7): # 先调用父类的构造函数,继承父类的属性 super().__init__(brand, color) # 子类自己的属性 self.seat_count = seat_count # 子类独有的方法 def off_road(self): print(f"{self.color}的{self.brand}开启越野模式!") # 重写父类的方法(多态) def run(self): self.speed += 20 print(f"{self.color}的{self.brand}在山路行驶,速度{self.speed}km/h") # 使用子类 my_suv = SUV("路虎", "白色") my_suv.run() # 调用重写后的方法:白色的路虎在山路行驶,速度20km/h my_suv.off_road() # 调用子类独有的方法:白色的路虎开启越野模式! print(my_suv.seat_count) # 7六、封装:把 "内部细节" 藏起来
封装就是只暴露必要的接口,隐藏内部实现。就像你开车只需要踩油门、刹车,不需要知道发动机怎么工作。
Python 中用 ** 单下划线_和双下划线__** 表示私有:
_属性名:约定俗成的私有,告诉别人 "别随便改",但实际上还能改__属性名:真正的私有,外部不能直接访问
class Car: def __init__(self, brand, color): self.brand = brand self.color = color self.__engine_temp = 90 # 发动机温度,私有属性,外部不能直接改 # 提供公开的方法来访问和修改私有属性 def get_engine_temp(self): return self.__engine_temp def set_engine_temp(self, temp): if 80 <= temp <= 100: self.__engine_temp = temp print("发动机温度已调整") else: print("温度异常,不能调整!") my_car = Car("丰田", "银色") # print(my_car.__engine_temp) # 报错,不能直接访问私有属性 print(my_car.get_engine_temp()) # 90 my_car.set_engine_temp(95) # 发动机温度已调整 my_car.set_engine_temp(150) # 温度异常,不能调整!七、一句话总结核心
- 类是模板,对象是实例
- 属性是特征,方法是行为
self是自己,__init__是初始化- 继承是复用,封装是隐藏,多态是重写
面向对象编程的本质就是:把现实世界的事物抽象成 "属性 + 方法" 的类,然后用对象来模拟现实世界的交互。