当前位置:首页>python>Python装饰器完全指南:从基础到深度学习应用

Python装饰器完全指南:从基础到深度学习应用

  • 2026-03-26 09:15:14
Python装饰器完全指南:从基础到深度学习应用

装饰器(Decorator)是Python中一种强大而优雅的语法特性,它允许我们在不修改函数或类本身的情况下,动态地为其添加新的功能。装饰器本质上是一个可调用对象(通常是函数或类),它接受一个函数作为输入,并返回一个新的函数(或修改后的原函数)。在深度学习领域,装饰器被广泛应用于性能优化、代码复用、调试监控等场景。本文将系统全面地介绍Python装饰器的原理、用法,并结合深度学习框架(如PyTorch)展示实际应用。

Python装饰器体系├── 内置装饰器│   ├── 类成员定义│   │   ├── @staticmethod  # 定义静态方法,不接收self/cls│   │   └── @classmethod   # 定义类方法,接收cls参数│   ├── 属性访问控制│   │   ├── @property   # 将方法转为只读属性│   │   ├── @<属性>.setter   # 定义属性的赋值逻辑│   │   └── @<属性>.deleter  # 定义属性的删除逻辑│   ├── 函数工具 (functools)│   │   ├── @functools.wraps  # 保留原函数元信息│   │   ├── @functools.lru_cache  # LRU缓存函数结果│   │   ├── @functools.cached_property  # 属性值缓存,只计算一次│   │   ├── @functools.singledispatch # 单分派泛型函数│   │   └── @functools.cache  # 无大小限制的缓存(Python3.9+)│   ├── 上下文管理│   │   └── @contextlib.contextmanager # 生成器转上下文管理器│   ├── 数据类│   │   └── @dataclasses.dataclass # 自动生成__init__等方法│   └── 其他│       └── @types.coroutine  # 将生成器标记为协程(旧式)└── 深度学习装饰器    ├── PyTorch内置    │   ├── @torch.no_grad() # 禁用梯度计算(推理/评估)    │   ├── @torch.enable_grad() # 强制启用梯度    │   └── @torch.inference_mode()  # 纯推理优化模式(≥1.9)    ├── 性能分析与调试    │   ├── 计时装饰器  # 测量函数执行耗时    │   ├── 日志装饰器  # 记录调用参数和返回值    │   └── 异常重试装饰器 # 函数失败自动重试    ├── 数据与模型管理    │   ├── 缓存装饰器  # 预处理结果缓存(如lru_cache)    │   ├── 参数验证装饰器  # 检查输入张量形状/类型    │   └── 自动设备放置  # 将输入/模型移至指定设备    ├── 训练流程控制    │   ├── 梯度裁剪装饰器  # 自动裁剪梯度防止爆炸    │   ├── 训练/评估模式切换  # 自动切换model.train/eval    │   └── 混合精度装饰器  # 应用AMP自动混合精度训练    └── 模型组件注册与扩展        ├── 模型注册装饰器  # 将类注册到全局字典便于动态创建        └── 钩子装饰器  # 为模型层注册前向/反向钩子

1. 装饰器基础

1.1 函数即对象

在Python中,函数是一等公民,这意味着:

  • 函数可以赋值给变量
  • 函数可以作为参数传递给另一个函数
  • 函数可以作为另一个函数的返回值
defgreet(name):returnf"Hello, {name}!"# 将函数赋值给变量say_hello = greetprint(say_hello("Alice"))  # 输出: Hello, Alice!

1.2 装饰器的本质

装饰器就是一个接受函数并返回新函数的函数(或类)。它可以在不修改原函数代码的情况下,增加额外的行为。

基本形式:

defdecorator(func):defwrapper(*args, **kwargs):# 在原函数执行前添加额外操作        result = func(*args, **kwargs)  # 调用原函数# 在原函数执行后添加额外操作return resultreturn wrapper

1.3 语法糖 @

使用 @decorator_name 语法可以更简洁地应用装饰器:

@decoratordefmy_function():pass

等价于:

defmy_function():passmy_function = decorator(my_function)

1.4 第一个装饰器示例

下面是一个简单的计时装饰器,用于测量函数执行时间:

import timedeftimer(func):defwrapper(*args, **kwargs):        start = time.time()        result = func(*args, **kwargs)        end = time.time()        print(f"{func.__name__} 执行耗时: {end - start:.4f}秒")return resultreturn wrapper@timerdefslow_function():    time.sleep(2)return"完成"slow_function()  # 输出: slow_function 执行耗时: 2.0012秒

1.5 保留原函数元信息(functools.wraps)

装饰器返回的 wrapper 函数会覆盖原函数的元信息(如 __name____doc__ 等)。使用 functools.wraps 可以解决这个问题:

import functoolsdeftimer(func):    @functools.wraps(func)defwrapper(*args, **kwargs):# ... 相同代码return resultreturn wrapper@timerdefslow_function():"""这是一个被计时装饰的函数"""    time.sleep(2)print(slow_function.__name__)  # 输出: slow_function (而不是wrapper)print(slow_function.__doc__)   # 输出: 这是一个被计时装饰的函数

2. 带参数的装饰器

如果装饰器本身需要接受参数(例如指定日志级别、超时时间等),则需要再嵌套一层函数,形成三层结构:

defrepeat(num_times):defdecorator(func):        @functools.wraps(func)defwrapper(*args, **kwargs):for _ in range(num_times):                result = func(*args, **kwargs)return resultreturn wrapperreturn decorator@repeat(3)defgreet(name):    print(f"Hello, {name}")greet("Bob")  # 打印三次 "Hello, Bob"

执行顺序:repeat(3) 返回 decorator,然后 @decorator 应用到 greet 上。

3. 多个装饰器的叠加

多个装饰器可以同时应用,执行顺序从下往上(靠近函数的装饰器先执行),但包装顺序是从内到外。

defbold(func):defwrapper():return"<b>" + func() + "</b>"return wrapperdefitalic(func):defwrapper():return"<i>" + func() + "</i>"return wrapper@bold@italicdefgreet():return"Hello"print(greet())  # 输出: <b><i>Hello</i></b>

执行流程:greet 先被 italic 装饰,返回的函数再被 bold 装饰。

4. 类装饰器

除了函数装饰器,还可以使用类作为装饰器。类装饰器必须实现 __call__ 方法,使其实例可调用。

classCountCalls:def__init__(self, func):        functools.update_wrapper(self, func)  # 类似 wraps        self.func = func        self.count = 0def__call__(self, *args, **kwargs):        self.count += 1        print(f"调用次数: {self.count}")return self.func(*args, **kwargs)@CountCallsdefsay_hi():    print("Hi!")say_hi()  # 调用次数: 1say_hi()  # 调用次数: 2

类装饰器适合需要维护状态的场景。

5. Python内置装饰器

Python提供了几个常用的内置装饰器,主要用于面向对象编程。

5.1 @staticmethod

将方法定义为静态方法,不接收实例(self)或类(cls)作为第一个参数。

classMath:    @staticmethoddefadd(x, y):return x + yprint(Math.add(35))  # 8

5.2 @classmethod

定义类方法,接收类作为第一个参数(通常命名为 cls),常用于工厂方法。

classPerson:def__init__(self, name):        self.name = name    @classmethoddeffrom_birth_year(cls, name, year):        age = 2025 - yearreturn cls(name)  # 注意这里用 cls 而不是 Person,支持继承p = Person.from_birth_year("Alice"1995)

5.3 @property

将方法转换为属性,允许使用点号访问,并可定义 getter/setter/deleter。

classCircle:def__init__(self, radius):        self._radius = radius    @propertydefradius(self):return self._radius    @radius.setterdefradius(self, value):if value < 0:raise ValueError("半径不能为负")        self._radius = value    @propertydefarea(self):return3.14 * self._radius ** 2c = Circle(5)print(c.area)    # 78.5c.radius = 10# 调用 setter

5.4 @functools.lru_cache

实现最近最少使用(LRU)缓存,对函数结果进行记忆化,特别适合计算密集或重复调用的函数。

import functools@functools.lru_cache(maxsize=128)deffibonacci(n):if n < 2:return nreturn fibonacci(n-1) + fibonacci(n-2)print(fibonacci(40))  # 快速返回结果

6. 深度学习中的常用装饰器

在深度学习(尤其是PyTorch)编程中,装饰器广泛用于简化代码、控制梯度、性能分析、注册组件等场景。

6.1 PyTorch 上下文装饰器

6.1.1 @torch.no_grad()

在推理或评估阶段,禁用梯度计算,减少内存消耗并加速计算。

import torchimport torch.nn as nnmodel = nn.Linear(102)x = torch.randn(510)@torch.no_grad()defpredict(model, x):return model(x)output = predict(model, x)  # 此过程中不会构建计算图

等价于 with torch.no_grad(): 上下文管理器。

6.1.2 @torch.enable_grad()

强制启用梯度计算(即使在 no_grad 上下文中)。

@torch.enable_grad()deftrain_step(model, x, y):    loss = nn.functional.mse_loss(model(x), y)    loss.backward()

6.1.3 @torch.inference_mode()(PyTorch 1.9+)

比 no_grad 更激进的优化,完全禁用梯度跟踪和相关视图,适用于纯推理。

@torch.inference_mode()definference(model, x):return model(x)

6.2 自定义性能分析装饰器

在训练过程中,经常需要监控各个步骤的耗时。

import timeimport functoolsdeftiming(func):    @functools.wraps(func)defwrapper(*args, **kwargs):        start = time.perf_counter()        result = func(*args, **kwargs)        end = time.perf_counter()        print(f"{func.__name__} took {end - start:.4f}s")return resultreturn wrapper@timingdeftrain_epoch(model, dataloader, optimizer):# 训练代码pass

6.3 日志记录装饰器

自动记录函数调用参数和返回值,便于调试。

deflog_call(func):    @functools.wraps(func)defwrapper(*args, **kwargs):        print(f"Calling {func.__name__} with args={args}, kwargs={kwargs}")        result = func(*args, **kwargs)        print(f"{func.__name__} returned {result}")return resultreturn wrapper@log_calldefload_data(path):# 假设加载数据returnf"data from {path}"

6.4 缓存装饰器(自定义或使用 lru_cache)

对于数据加载或预处理函数,使用缓存避免重复计算。

import functools@functools.lru_cache(maxsize=10)defpreprocess_image(path):# 假设读取并预处理图像    print(f"Preprocessing {path}")returnf"processed {path}"# 第二次调用相同路径时直接返回缓存结果

6.5 参数验证/类型检查

确保输入符合预期,尤其在数据加载或模型前向传播前。

defvalidate_input(func):    @functools.wraps(func)defwrapper(tensor, *args, **kwargs):ifnot torch.is_tensor(tensor):raise TypeError("输入必须是 torch.Tensor")if tensor.dim() != 4:raise ValueError("输入必须是4维张量 (batch, channel, H, W)")return func(tensor, *args, **kwargs)return wrapper@validate_inputdefforward(self, x):return self.model(x)

6.6 自动设备放置

将模型或张量自动移动到指定设备(GPU/CPU),简化代码。

defto_device(device="cuda"):defdecorator(func):        @functools.wraps(func)defwrapper(*args, **kwargs):            new_args = [arg.to(device) if torch.is_tensor(arg) else arg for arg in args]            new_kwargs = {k: v.to(device) if torch.is_tensor(v) else v for k, v in kwargs.items()}            result = func(*new_args, **new_kwargs)if torch.is_tensor(result):                result = result.to(device)return resultreturn wrapperreturn decorator@to_device(device="cuda")defprocess_tensor(x, y):return x + y

6.7 模型注册装饰器

在构建模型库时,常用装饰器将模型类注册到全局字典,便于通过名称动态创建。

MODEL_REGISTRY = {}defregister_model(name):defdecorator(cls):        MODEL_REGISTRY[name] = clsreturn clsreturn decorator@register_model("resnet50")classResNet50:pass@register_model("vit_base")classViTBase:passdefcreate_model(name, **kwargs):return MODEL_REGISTRY[name](**kwargs)

6.8 梯度裁剪装饰器

在训练循环中,对梯度进行裁剪以防止梯度爆炸。

defclip_grad_norm(max_norm):defdecorator(train_step_func):        @functools.wraps(train_step_func)defwrapper(model, *args, **kwargs):            loss = train_step_func(model, *args, **kwargs)            torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm)return lossreturn wrapperreturn decorator@clip_grad_norm(1.0)deftrain_step(model, x, y, optimizer):    optimizer.zero_grad()    loss = nn.functional.mse_loss(model(x), y)    loss.backward()    optimizer.step()return loss

6.9 训练/评估模式切换

自动将模型切换到 train() 或 eval() 模式,并在函数执行后恢复。

defset_mode(mode='train'):defdecorator(func):        @functools.wraps(func)defwrapper(model, *args, **kwargs):            previous_mode = model.trainingif mode == 'train':                model.train()else:                model.eval()try:                result = func(model, *args, **kwargs)finally:if previous_mode:                    model.train()else:                    model.eval()return resultreturn wrapperreturn decorator@set_mode('eval')defevaluate(model, dataloader):# 此时模型处于 eval 模式pass

6.10 异常重试装饰器

在数据加载或网络请求失败时自动重试。

import timedefretry(max_attempts=3, delay=1):defdecorator(func):        @functools.wraps(func)defwrapper(*args, **kwargs):for attempt in range(max_attempts):try:return func(*args, **kwargs)except Exception as e:                    print(f"Attempt {attempt+1} failed: {e}")                    time.sleep(delay)raise RuntimeError(f"Failed after {max_attempts} attempts")return wrapperreturn decorator@retry(max_attempts=3)defdownload_data(url):# 可能失败的下载操作pass

7. Python 装饰器体系

7.1 内置装饰器

  • 类成员定义
    • @staticmethod:定义静态方法,不接收隐式 self 或 cls
    • @classmethod:定义类方法,接收类作为第一个参数
  • 属性访问控制
    • @property:将方法转换为只读属性
    • @<属性名>.setter:定义属性的赋值逻辑
    • @<属性名>.deleter:定义属性的删除逻辑
  • 函数工具(functools)
    • @functools.wraps:保留被装饰函数的元信息(__name____doc__
    • @functools.lru_cache:LRU 缓存函数结果,减少重复计算
    • @functools.cached_property:属性值缓存,仅计算一次
    • @functools.singledispatch:单分派泛型函数,根据第一个参数类型执行不同实现
    • @functools.cache:无大小限制的简单缓存(Python 3.9+)
  • 上下文管理
    • @contextlib.contextmanager:将生成器函数转换为上下文管理器
  • 数据类
    • @dataclasses.dataclass:自动生成 __init____repr__ 等方法
  • 其他
    • @types.coroutine:将生成器标记为协程(旧式协程)

7.2 深度学习装饰器(常见于 PyTorch)

  • PyTorch 内置
    • @torch.no_grad():禁用梯度计算,用于推理或评估阶段
    • @torch.enable_grad():强制启用梯度,覆盖上级 no_grad 上下文
    • @torch.inference_mode():纯推理优化模式(PyTorch ≥1.9),比 no_grad 更高效
  • 性能分析与调试
    • 计时装饰器:测量函数执行耗时并打印
    • 日志装饰器:记录函数调用参数和返回值
    • 异常重试装饰器:函数执行失败时自动重试(可设置次数与延迟)
  • 数据与模型管理
    • 缓存装饰器:对预处理等函数结果进行缓存(常基于 lru_cache
    • 参数验证装饰器:检查输入张量的形状、类型、设备是否符合要求
    • 自动设备放置:将输入张量和模型自动移动到指定设备(CPU/GPU)
  • 训练流程控制
    • 梯度裁剪装饰器:自动对模型梯度进行裁剪,防止梯度爆炸
    • 训练/评估模式切换:自动切换 model.train() 或 model.eval(),并在执行后恢复原状态
    • 混合精度装饰器:自动应用自动混合精度(AMP)训练
  • 模型组件注册与扩展
    • 模型注册装饰器:将模型类注册到全局字典,便于通过名称动态创建实例
    • 钩子装饰器:为模型层注册前向或反向钩子,用于特征提取或调试

总结

Python装饰器是一种元编程工具,通过简洁的语法实现了横切关注点的分离,让代码更加模块化和可复用。本文从基础概念出发,介绍了函数装饰器、带参数装饰器、多个装饰器叠加、类装饰器,以及Python内置的常用装饰器。在深度学习领域,装饰器被广泛应用于梯度控制、性能分析、日志记录、缓存、参数验证、模型注册等场景,极大提升了开发效率和代码可读性。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-03-27 13:19:11 HTTP/2.0 GET : https://f.mffb.com.cn/a/482490.html
  2. 运行时间 : 0.138695s [ 吞吐率:7.21req/s ] 内存消耗:4,508.95kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=4ac895c2cc5d2e8818eacafcd86e2bfb
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000473s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000748s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.002341s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000610s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000570s ]
  6. SELECT * FROM `set` [ RunTime:0.000887s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000554s ]
  8. SELECT * FROM `article` WHERE `id` = 482490 LIMIT 1 [ RunTime:0.002648s ]
  9. UPDATE `article` SET `lasttime` = 1774588751 WHERE `id` = 482490 [ RunTime:0.008402s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.002695s ]
  11. SELECT * FROM `article` WHERE `id` < 482490 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.003661s ]
  12. SELECT * FROM `article` WHERE `id` > 482490 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.002528s ]
  13. SELECT * FROM `article` WHERE `id` < 482490 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.017714s ]
  14. SELECT * FROM `article` WHERE `id` < 482490 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.003179s ]
  15. SELECT * FROM `article` WHERE `id` < 482490 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002341s ]
0.140156s