上一节我们画了张"汽车图纸",搞懂了类是模板、对象是实体。今天直接拆开发动机——带你钻进类定义的内部,看清它的"五脏六腑":构造器、属性、方法、文档,一次讲全。记住下面这张图,后续的进阶部分语法都是给它打补丁。
如上图所示,我们比较完整的定义了一个 Car 类,清晰地区分了类属性(wheels/total_cars)和实例属性(brand/model/year)。本篇我们就围绕这个Car 类用 “造车” 的逻辑类比讲解,保证一看就懂;阅读时一定要留意:“类” 是图纸,“对象” 是造出来的具体车,二者完全不同。
一、文档字符串
每辆车都应该有一份"说明书",告诉使用者这车是干嘛的、有什么配置。同样的,在 Python 类里文档字符串就是干这个的——类的说明书,介绍类的作用以及属性和方法。
class Car: """汽车类,用于创建和管理汽车对象。 属性: brand (str): 汽车品牌 model (str): 汽车型号 year (int): 生产年份,默认为2024 """
语法
- • 用三重引号
""" 包起来,放在 class 语句下面第一行; - • 内容一般包括:类的作用、有哪些属性、有哪些方法
- • 可以通过
help(类名) 方法来查看类的文档。
>>> help(Car)Help on class Car in module __main__:class Car(builtins.object) | Car(brand, model, year=2024) | | 汽车类,用于创建和管理汽车对象。 | | 属性: | brand (str): 汽车品牌 | model (str): 汽车型号 | year (int): 生产年份, 默认为2024 | | Methods defined here: | | __init__(self, brand, model, year=2024) | 初始化汽车实例 | | honk(self) | 按喇叭(简单的实例方法演示) | | ----------------------------------- | Class methods defined here:-- More --
二、构造器 __init__
上一节我们直接写了car = Car(),但这样创建出来的车没有品牌、没有型号,就像一辆"白板车"。
我们需要一个自动初始化的流程,造新车时,直接把品牌、型号、年份这些配置装好 —— 这就是构造器 __init__ 的作用,它会在创建对象的瞬间自动执行。
class Car: """汽车类""" def __init__(self, brand, model, year=2024): """构造器:创建对象时自动执行""" self.brand = brand # 把传入的brand赋值给实例 self.model = model # 把传入的model赋值给实例 self.year = year # 默认属性:如果不传年份,默认2024
在这里如果是初学者肯定很困惑,这个 self 是什么?这是一个关键概念,我们在定义 Car 的代码后继续增加以下代码方便进行讲解说明:
class Car: .......if __name__ == "__main__": # 创建实例(演示实例属性、类属性) car1 = Car("比亚迪", "汉", 2023) car2 = Car("特斯拉", "Model 3") # 调用实例方法 car1.honk() car2.honk() # 访问类属性和类方法 print(f"\n所有汽车的标准轮子数:{Car.wheels} 个") print(f"总共创建的汽车数量:{Car.get_total_cars()} 辆")
当执行 car1 = Car("比亚迪", "汉", 2023) 时,Python 偷偷做了三件事:
- 1. 先在内存里 “焊一个空车架”(创建空对象);
- 2. 自动调用
__init__,把 “空车架” 当成第一个参数传进去(传入空对象); - 3. 这个 “空车架” 就是
self,后续给 self.brand 赋值,就是给这辆车装品牌。
所以:
- •
self.brand = brand 就是在说:"这辆车的品牌是比亚迪"
>>> my_car = Car("比亚迪", "汉", 2023) # 这里自动调用了 __init__>>> print(my_car.brand)比亚迪
- •
__init__ 两边是双下划线,这叫"魔术方法"(Magic Methods),Python 叫它 “魔术方法”—— 到了 “创建对象” 这个特定时机,会自动触发; - • 造对象时传的参数(比如 "比亚迪"),会按顺序传给
__init__(self 后第一个参数)。
三、属性
属性就是汽车的 “数据信息”,比如品牌、轮子数、生产总数。对应的 Python 类中的属性,可以分为两种:实例属性、类属性。
3.1、实例属性:self.xx
每个实例(每辆车)独立拥有,改了一个实例(一辆车)的,不影响其他实例(车)。
>>> car1 = Car("比亚迪", "汉", 2023)>>> car2 = Car("特斯拉", "Model 3", 2024)>>> car1.model = "宋" # car1改款成了宋>>> print(car1.model) # 宋>>> print(car2.model) # Model 3(不受影响,还是特斯拉的)
3.2、类属性:直接写在类里的变量
所有对象共享一份,像"出厂标准配置",比如所有车都有 4 个轮子,造了多少辆车的总数。
>>> car1 = Car("比亚迪", "汉")>>> car2 = Car("特斯拉", "Model 3")>>> print(Car.total_cars)2 # Car 一共生产了两辆车>>> print(car1.wheels) # 可以通过对象访问4>>> print(Car.wheels) # 也可以通过类访问4
四、方法
方法就是类里的函数,对应汽车的 “功能”,比如按喇叭、跑起来,主要分两种:实例方法和类方法。
4.1、实例方法
比如按喇叭、开空调,第一个参数必须是 self(这是铁律!),因为要明确操作 “哪辆车”(哪个对象):
>>> car1 = Car("比亚迪", "汉", 2023)>>> car1.honk() # 自动把car1传给self比亚迪汉:嘀嘀!🎺"
为什么需要self?因为方法里要访问对象的属性。不写 self,Python 不知道你要操作哪辆车的数据。比如你喊 “按喇叭”,得说清楚 “让比亚迪汉按喇叭”,而不是 “让特斯拉按喇叭”——self 就是 “这辆车”。
4.2、类方法
比如统计工厂总共造了多少辆车,不是操作某一辆车,而是操作 “类(图纸 / 工厂)” 本身:
- • 用
@classmethod 标记(装饰器); - • 第一个参数是
cls(代表类本身,不是某辆车);
>>> car1 = Car("比亚迪", "汉")>>> car2 = Car("特斯拉", "Model 3")>>> Car.get_total_cars()2