回顾第12期最后练习题解答
✅ 1. Vehicle
类继承重写
class Vehicle:
def move(self):
print("Vehicle is moving")
class Car(Vehicle):
def move(self):
print("Car is driving")
class Bike(Vehicle):
def move(self):
print("Bike is riding")
✅ 2. super()
的使用
class Vehicle:
def __init__(self, brand):
self.brand = brand
class Car(Vehicle):
def __init__(self, brand, model):
super().__init__(brand)
self.model = model
✅ 3. __str__
与 __repr__
class Movie:
def __init__(self, title):
self.title = title
def __str__(self):
return f"🎬 {self.title}"
def __repr__(self):
return f"Movie(title={self.title!r})"
✅ 4. 多态练习
def describe(animal):
animal.speak()
describe(Car()) # Car is driving
describe(Bike()) # Bike is riding
本期主题:装饰器基础
🟦 13.1 函数也是对象
在 Python 中,函数本质上是“一等对象”:
-
可以作为参数传入
-
可以作为返回值返回
-
可以赋值给变量
def greet():
print("Hello!")
say_hi = greet
say_hi() # Hello!
13.2 闭包(Closure)
闭包就是函数里定义函数,且内部函数可以访问外部函数的变量。
def outer(name):
def inner():
print(f"Hello, {name}")
return inner
greeting = outer("Alice")
greeting() # Hello, Alice
13.3 什么是装饰器?
装饰器 = 在不修改函数定义的前提下,增强函数功能。
基本语法结构:
def decorator(func):
def wrapper():
print("Before function call")
func()
print("After function call")
return wrapper
@decorator
def say_hello():
print("Hello!")
say_hello()
输出:
Before function call
Hello!
After function call
13.4 装饰器函数结构拆解
@decorator
def func():
...
# 等价于:
func = decorator(func)
13.5 带参数的装饰器
def logger(func):
def wrapper(*args, **kwargs):
print(f"Calling {func.__name__}")
return func(*args, **kwargs)
return wrapper
@logger
def add(a, b):
return a + b
print(add(2, 3)) # 输出日志并返回 5
13.6 带参数的装饰器(再上一步)
def repeat(n):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(n):
func(*args, **kwargs)
return wrapper
return decorator
@repeat(3)
def greet():
print("Hi!")
greet()
本期小练习
-
编写一个装饰器,记录函数的运行时间。
-
写一个装饰器
@check_login
,判断是否“登录”再执行函数。 -
尝试用装饰器装饰有返回值的函数,保证返回值不变。
-
写一个带参数的装饰器,比如
@repeat(n)
。
📌 本期小结
-
理解了函数对象与闭包
-
掌握了装饰器的基本形式与语法糖
@
-
学会编写带参数的装饰器
-
体会了装饰器的灵活性与代码增强能力
第14期预告
下一期我们将深入学习:
-
Python 中的迭代器与生成器
-
yield
关键字的魔法 -
自定义迭代器类与惰性计算
-
实战:用生成器处理超大数据集