Python语法系列博客 · 第13期函数即对象 · 闭包与装饰器初探

回顾第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()

本期小练习

  1. 编写一个装饰器,记录函数的运行时间。

  2. 写一个装饰器 @check_login,判断是否“登录”再执行函数。

  3. 尝试用装饰器装饰有返回值的函数,保证返回值不变。

  4. 写一个带参数的装饰器,比如 @repeat(n)


📌 本期小结

  • 理解了函数对象与闭包

  • 掌握了装饰器的基本形式与语法糖 @

  • 学会编写带参数的装饰器

  • 体会了装饰器的灵活性与代码增强能力

第14期预告

下一期我们将深入学习:

  • Python 中的迭代器与生成器

  • yield 关键字的魔法

  • 自定义迭代器类与惰性计算

  • 实战:用生成器处理超大数据集

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值