Python 类 · 继承 · 精讲 2026-08-31

什么时候用函数,什么时候用类

数据+逻辑简单用函数;数据复杂且需要“管家”来维护,用类。

函数 = 自动售货机
你投币(输入),它哐当掉出可乐(输出)。它不记得你,每次交易独立。
类 = 私人管家
你得先雇佣他(创建实例),他记住你的一切:姓什么、喜欢喝啥(属性)。你要咖啡,他知道加几分糖。

类 · 实例 · __init__

类 = 饼干模具(蓝图),实例 = 压出来的每一块星星饼干

# 类定义(模具) class Cookie: def __init__(self, flavor): # ← 压饼干的"那一下动作" print(f"正在制作 {flavor} 味饼干...") self.flavor = flavor # 给这块饼干贴标签 self.bites = 0 # 记录被咬了几口 # 压两块饼干(实例化) c1 = Cookie("巧克力") # 输出:正在制作 巧克力 味饼干... c2 = Cookie("抹茶") # 输出:正在制作 抹茶 味饼干...
__init__ 就是"实例的出厂设置" —— 每个饼干一诞生,就被刻上独属于自己的属性。
比如 c1 = Cookie("巧克力") 里的 "巧克力",就是通过 __init__ 塞进 c1 肚子里的第一个数据。

__init__ 的 3 个死规矩

类里面函数(实例方法)

class Cookie: def __init__(self, flavor): self.flavor = flavor self.size = 10 def eat_all(self): # 一口吃完 self.size = 0 # 修改属性 print(f"{self.flavor}味饼干被吃光了!") c = Cookie("抹茶") c.eat_all() # 抹茶味饼干被吃光了! print(c.size) # 0 c1.size = 5 # 也可以这样修改属性

实例 对象放进列表(饼干仓库)

# 创建一个空列表(饼干仓库) cookie_jar = [] # 做3块饼干,放进列表 c1 = Cookie("巧克力") c2 = Cookie("抹茶") c3 = Cookie("草莓") cookie_jar.append(c1) cookie_jar.append(c2) cookie_jar.append(c3) # 遍历列表,让每块饼干自己报口味 for cookie in cookie_jar: print(cookie.flavor)

类练习题 · 婚礼礼金程序

需求说明
朋友结婚,你帮忙收彩礼。记录姓名和礼金,计算统计信息。
新建类 Customer,属性 name 和 money
循环输入 "小明 1000",构造对象存入列表
输入 quit 退出,输出总人数、总金额、最大/最小/平均
# 婚礼礼金程序.py class Customer: def __init__(self, name, money): self.name = name self.money = money customers = [] while True: info = input("请输入来人姓名和金额:") if info == "quit": break name, money = info.split() money = int(money) customers.append(Customer(name, money)) print("访客总人数:", len(customers)) moneys = [c.money for c in customers] print("总金额:", sum(moneys)) print("最大金额:", max(moneys)) print("最小金额:", min(moneys)) print("平均金额:", sum(moneys) / len(moneys))

类的继承

让孩子继承父母的“家产”——一个类可以继承另一个类的属性和方法。

基本语法

# 父类(基类) class Animal: def __init__(self, name): self.name = name def eat(self): print(f"{self.name} 在吃东西") # 子类(派生类) class Dog(Animal): # 括号里写父类名 def bark(self): print(f"{self.name} 在汪汪叫") dog = Dog("旺财") dog.eat() # 旺财 在吃东西(继承) dog.bark() # 旺财 在汪汪叫(自己的) # 关键点:子类 Dog 没写 __init__ 和 eat,但自动拥有了父类 Animal 的所有功能。

继承的三大好处

代码复用 — 子类直接用父类方法
扩展功能 — 子类添加新方法
多态 — 同一方法不同子类不同表现

重写父类方法(覆盖)

class Animal: def speak(self): print("动物在叫") class Dog(Animal): def speak(self): # 重写 print("汪汪汪!") class Cat(Animal): def speak(self): print("喵喵喵~") dog = Dog() dog.speak() # 汪汪汪!

子类自己的 __init__(super())
如果子类有自己的属性,需要先调用父类的 __init__,再初始化自己的:

class Animal: def __init__(self, name, age): self.name = name self.age = age class Dog(Animal): def __init__(self, name, age, breed): # breed 子类独有 super().__init__(name, age) # 调用父类 __init__ self.breed = breed dog = Dog("旺财", 3, "金毛") print(dog.name) # 旺财(来自父类) print(dog.breed) # 金毛(自己的)
常见问题 Q&A
如果子类没有自己的 __init__,Python 会自动调用父类的;
如果子类有自己的 __init__,必须手动调用 super().__init__(),否则父类属性不会被初始化。