Python 类 · 继承 · 精讲
什么时候用函数,什么时候用类
数据+逻辑简单用函数;数据复杂且需要“管家”来维护,用类。
函数 = 自动售货机
你投币(输入),它哐当掉出可乐(输出)。它不记得你,每次交易独立。
类 = 私人管家
你得先雇佣他(创建实例),他记住你的一切:姓什么、喜欢喝啥(属性)。你要咖啡,他知道加几分糖。
类 · 实例 · __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 个死规矩
- 名字必须叫 __init__ —— 贴标签的机器必须叫“贴标机”,改名没人认
- 第一个参数必须是 self —— 代表当前这块饼干本身
- 不能写 return(或只能 return None)—— 贴标机只管贴,不负责把饼干递给你
类里面函数(实例方法)
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)
c1.size = 5
- 实例方法 = 函数里用了 self,代表“某块具体饼干自己”
- 必须先创建实例(c1 = Cookie("巧克力")),才能调用方法
实例 对象放进列表(饼干仓库)
cookie_jar = []
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 退出,输出总人数、总金额、最大/最小/平均
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()
继承的三大好处
代码复用 — 子类直接用父类方法
扩展功能 — 子类添加新方法
多态 — 同一方法不同子类不同表现
重写父类方法(覆盖)
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):
super().__init__(name, age)
self.breed = breed
dog = Dog("旺财", 3, "金毛")
print(dog.name)
print(dog.breed)
- super() 就是“调用父类的方法”,相当于说:“爸,你先把我那份基础东西初始化了,我再弄我自己的”。
常见问题 Q&A
如果子类没有自己的 __init__,Python 会自动调用父类的;
如果子类有自己的 __init__,必须手动调用 super().__init__(),否则父类属性不会被初始化。