当前位置:首页>python>Python OOP 设计思想 12:抽象源于使用经验

Python OOP 设计思想 12:抽象源于使用经验

  • 2026-01-14 02:24:09
Python OOP 设计思想 12:抽象源于使用经验

在许多软件工程方法论中,“抽象”(Abstract被视为设计的起点:先抽象概念,再落地实现。但在 Python 的设计语境中,这一路径往往是反的。Python 更鼓励从具体使用中生长抽象,而非用抽象预设未来

12.1 抽象不是起点

在静态建模导向的语言中,常见流程是:

需求 → 抽象 → 类型 → 实现

而在 Python 中,这条路径往往带来过度设计。原因并不在于抽象本身,而在于抽象缺乏足够的使用语义支撑。

抽象基类(ABC)在 Python 中并不是语言强制的接口机制,而是一种显式约束工具。它更适合在接口语义已经稳定、使用方式明确的场景下,用来表达“必须如此使用”的设计承诺。

当抽象被用作“设计起点”而非“经验总结”时,ABC 往往承载的是预测性的假设,而非已经验证的使用事实。

示例:过早抽象的典型问题

from abc import ABC, abstractmethod# 设计初期就定义抽象基类class DataSource(ABC):    # 在了解具体需求前就抽象    @abstractmethod    def read(self):        """读取数据"""        pass    @abstractmethod    def write(self, data):        """写入数据"""        pass# 后来发现有些数据源只需要读,不需要写class ReadOnlySource(DataSource):    # 被迫实现不需要的方法    def read(self):        return "data"    def write(self, data):    # 不自然的实现        raise NotImplementedError("只读数据源")

该示例的问题不在于使用了 ABC,而在于抽象先于使用出现。

read() 与 write() 是否应并列为同一接口,并未经过真实调用验证,却被提前固化为设计前提。

在 Python 的对象模型中:

• 行为通过属性与调用体现

• 接口在使用中显现

• 多态在调用点成立

在 Python 中,一旦抽象被引入,就意味着对未来实现方式的提前裁决,这种裁决若缺乏使用经验支撑,往往会反过来束缚实现。

Python 并不反对抽象,但反对脱离使用经验的抽象。

12.2 从具体使用中提炼抽象

在 Python 项目中,抽象更常见的来源不是“领域分析文档”,而是重复出现的使用模式(Usage Pattern)

“使用模式”指的是:在不同上下文中,代码被反复以相似方式调用的结构性特征。

Python 的抽象并非来自概念拆解,而是来自这些模式在多个调用点中自然显现。

以下示例展示了通过观察具体实现中的重复模式,逐步提炼出抽象接口的过程。

第一阶段:具体的实现

# 原始、分散的功能def load_from_file(path):    """文件数据加载的具体实现"""    with open(path) as f:        return f.read()def load_from_http(url):    """HTTP数据加载的具体实现"""    import requests    return requests.get(url).textdef load_from_database(query):    """数据库数据加载的具体实现"""    import sqlite3    conn = sqlite3.connect("app.db")    return conn.execute(query).fetchall()

第二阶段:发现使用模式的一致性

# 识别重复代码# 多个调用点开始呈现相似结构def process_data_from_file(path):    """处理文件数据 - 观察到重复的模式"""    data = load_from_file(path)    # 文件数据源 - 特定调用    return analyze(data)           # 通用处理逻辑def process_data_from_web(url):    """处理网页数据 - 观察到相同的模式"""    data = load_from_http(url)     # 网络数据源 - 特定调用    return analyze(data)           # 通用处理逻辑(与上面相同)

第三阶段:自然提炼抽象

# 抽象出统一接口def process_data(source):    """    统一处理函数 - 从具体模式中提炼出的抽象    抽象核心:source 只需要有 load 方法    无需关心数据来自文件、网络还是数据库    """    data = source.load()    # 统一的接口调用 - 关键抽象点    return analyze(data)# 统一的数据源接口 - 抽象化的结果class DataSource:    """数据源抽象接口 - 从具体使用模式中提炼出的共同契约"""    def load(self):        """加载数据抽象方法 - 所有数据源必须实现"""        raise NotImplementedError("具体数据源需要实现 load 方法")

第四阶段:具体实现

# 封装原始功能,适配统一接口class FileDataSource(DataSource):    """文件数据源 - 实现抽象接口的具体类"""    def __init__(self, path):        self.path = path    def load(self):        """实现接口:将原始功能包装为统一格式"""        with open(self.path) as f:            return f.read()# 其他具体实现(扩展)class HttpDataSource(DataSource):    """HTTP数据源 - 遵循同一接口的新实现"""    def __init__(self, url):        self.url = url    def load(self):        """统一的load方法实现"""        import requests        return requests.get(self.url).textclass DatabaseDataSource(DataSource):    """数据库数据源 - 同样遵循接口"""    def __init__(self, query):        self.query = query    def load(self):        import sqlite3        conn = sqlite3.connect("app.db")        return conn.execute(self.query).fetchall()

使用示例:

# 创建不同数据源,但使用相同接口sources = [    FileDataSource("data.txt"),                  # 文件源    HttpDataSource("http://example.com"),        # HTTP源    DatabaseDataSource("SELECT * FROM users")    # 数据库源    ]for source in sources:    # 统一调用方式,无需关心具体实现    data = source.load()  # ← 关键:统一的抽象接口    print(f"   加载数据: {type(source).__name__}")

这里的关键变化并非“引入了类”,而是调用点被统一。

抽象的核心不是“谁继承谁”,而是“调用方是否可以不关心具体来源”。

当多个调用点已经证明只依赖 load 这一行为时,抽象便不再是猜测,而是对现实的总结。

Python 中成熟的抽象,往往具有以下特征:

• 源于多个真实调用场景

• 能被现有代码自然替换

• 不改变调用方语义

这种抽象不是概念优先,而是使用驱动。

12.3 抽象的稳定性问题

接口稳定性并非来源于设计严谨,而是来源于:接口是否已经经历足够多的真实调用与失败场景。

在 Python 中,接口一旦暴露,就成为协作契约,其修改成本往往高于具体实现。

# 早期抽象容易变化class Storage:    # 过早抽象    def save(self, data):    # 早期版本        pass    def load(self):          # 早期版本        pass# 后来发现需要更多参数class Storage2:    # 被迫修改接口    def save(self, data, compress=False):    # 添加参数        pass    def load(self, decompress=False):        # 添加参数        pass# 如果等待使用经验再抽象def save_to_file(data, path):    # 具体实现    with open(path, "w"as f:        f.write(data)def save_to_cloud(data, bucket):    # 具体实现    cloud_client.upload(bucket, data)# 从使用经验中发现共性后再抽象def save_data(data, destination, **options):    """稳定的抽象:基于实际使用模式"""    return destination.store(data, **options)

该示例表明,过早抽象的最大风险不是“写错接口”,而是过早冻结变化方向。

在 Python 中,抽象的稳定性取决于两个因素:

• 使用方式是否已稳定

• 失败路径是否已被理解

当使用尚未成熟时,参数、返回值乃至失败语义都处于不稳定状态,此时抽象只会放大未来的重构成本。

12.4 过早抽象的风险

Python 并不将“重复代码”视为原罪。真正值得警惕的,是重复且稳定的使用模式,因为那意味着一个尚未被命名的抽象正在形成。

“不要过早抽象”并不是一句风格化建议,而是 Python 设计实践中的经验结论。

# 过早抽象的典型表现class PaymentProcessor(ABC):    # 在只有一个支付方式时就抽象    @abstractmethod    def process(self, amount):        pass    @abstractmethod    def refund(self, transaction_id):    # 可能不需要的功能        pass# 后来发现只需简单支付功能class SimplePayment:    def pay(self, amount):    # 更简单的接口        print(f"Paid ${amount}")# 重复代码不是问题,模式重复才是信号def process_credit_card(card, amount):    # 具体实现 1    passdef process_paypal(email, amount):    # 具体实现 2 - 与 credit_card 有相似之处    passdef process_stripe(token, amount):    # 具体实现 3 - 模式开始显现    pass# 当发现模式重复时再抽象def process_payment(payment_method, amount):    """从重复模式中提炼的抽象"""    return payment_method.charge(amount)

示例中的多个支付函数并非设计失败,而是抽象的前奏。只有当调用方式开始趋同时,抽象才具备现实依据。

在 Python 中,抽象不是为了消除重复,而是为了压缩已经存在的复杂度。

过早抽象的后果有:

• 调用方复杂度上升

• 实现自由度下降

• 重构成本被人为放大

在 Python 中,重复代码本身并不是坏事。重复而稳定的使用模式,才是抽象出现的信号。

12.5 抽象的重构时机

在 Python 项目中,恰当的抽象往往出现在重构阶段,而非初始设计阶段。

重构(Refactoring)并不是修改设计方向,而是对既有使用经验的结构化整理。抽象在这一阶段出现,往往是被“逼出来的”,而非“想出来的”。

# 重构前:多个相似实现def backup_to_local(data):    with open("backup.txt""w"as f:        f.write(data)def backup_to_s3(data):    s3_client.put_object("backup.txt", data)def backup_to_database(data):    db.execute("INSERT INTO backups VALUES (?)", (data,))# 重构时机出现:使用模式稳定class BackupStrategy:    # 从经验中抽象    def backup(self, data, target_name):        raise NotImplementedErrorclass LocalBackup(BackupStrategy):    def backup(self, data, target_name):        with open(target_name, "w"as f:            f.write(data)class S3Backup(BackupStrategy):    def backup(self, data, target_name):        s3_client.put_object(target_name, data)# 统一的使用接口def backup_data(data, strategy, target_name):    return strategy.backup(data, target_name)

此时引入策略类,并未增加系统复杂度,而是将已经存在的差异显式化。

抽象的价值在于:让变化的位置清晰,而不是让设计显得高级。

可靠的抽象时机通常具备以下迹象:

• 多个实现已经存在

• 调用点呈现高度一致性

• 失败语义可以被统一描述

• 接口变化的方向已经明确

此时,引入抽象并不是增加复杂度,而是压缩已存在的复杂度。抽象在这里承担的角色,不是预测未来,而是总结过去。

12.6 渐进式抽象的模式

在 Python 中,抽象并非一次性完成的设计决策,而是一个逐步加深的过程。合理的抽象往往经历从“具体实现”到“参数化函数”,再到“显式对象与策略”的演化路径。每一层抽象的引入,都应由真实使用压力推动,而非由设计完整性驱动。

渐进式抽象是一种承认不确定性的设计态度。它假设:我们无法在一开始就知道正确的抽象形态,只能逐步逼近。

示例:渐进式抽象过程

# 阶段 1:具体实现 - 最简单直接的解决方案def fetch_users_from_db():    """具体实现 1:直接获取用户数据"""    return db.query("SELECT * FROM users")    # 硬编码 SQL,特定用途def fetch_products_from_api():    """具体实现 2:直接获取产品数据"""    return requests.get("/api/products").json()    # 硬编码URL,特定用途# 阶段 2:函数参数化(轻量抽象)- 发现重复模式后的初步优化def fetch_from_db(table):    """    轻量抽象:参数化 SQL 表名    发现 fetch_users_from_db 和未来可能需要的    fetch_products_from_db 有相同模式,提取参数。    这是最小可行的抽象。    """    return db.query(f"SELECT * FROM {table}")  # 参数化表名,但仍限定于数据库def fetch_from_api(endpoint):    """    轻量抽象:参数化 API 端点    从具体 API 调用中提炼出通用模式。    比直接硬编码 URL 更灵活,但仍限定于 HTTP API。    """    return requests.get(endpoint).json()  # 参数化端点# 阶段 3:策略模式(重量抽象)- 需要更大灵活性时才引入class DataFetcher:    """    重量抽象:统一数据获取接口    当需要处理多种数据源(数据库、API、文件等),    且希望统一调用方式时,才引入这种抽象层次。    """    def fetch(self):        """抽象方法:所有数据获取器必须实现"""        raise NotImplementedError("具体子类必须实现fetch方法")class DatabaseFetcher(DataFetcher):    """    具体策略:数据库数据获取    将 fetch_from_db 函数重构为类形式,    实现统一的 DataFetcher 接口。    """    def __init__(self, table):        """初始化:仍然需要具体参数"""        self.table = table    def fetch(self):        """实现抽象接口"""        return db.query(f"SELECT * FROM {self.table}")class ApiFetcher(DataFetcher):    """    另一个具体策略:API 数据获取    同样实现 DataFetcher 接口,提供统一调用方式。    """    def __init__(self, endpoint):        self.endpoint = endpoint    def fetch(self):        return requests.get(self.endpoint).json()

从函数到参数化,再到对象策略,并不是“设计升级”,而是责任逐渐显形的过程。每一步抽象的引入,都应有明确的使用压力作为理由。

渐进式抽象的价值在于:它允许代码在早期保持简单,在需求明确后再引入结构,从而避免因过早冻结接口而限制系统演化。

📘 小结

在 Python 的设计哲学中,抽象不是起点,而是使用经验的沉淀结果。只有经历真实调用、多态分化与失败路径考验的行为,才值得被抽象为接口。过早抽象冻结不成熟的理解,延迟抽象反而保留演化空间。Python 鼓励让抽象在实践中自然生长,而非被设计预先规定。

点赞有美意,赞赏是鼓励

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-09 00:06:51 HTTP/2.0 GET : https://f.mffb.com.cn/a/462403.html
  2. 运行时间 : 0.105031s [ 吞吐率:9.52req/s ] 内存消耗:4,492.24kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=9ada598bf5afdf463be6830669eafea0
  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.000588s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000898s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000356s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000283s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000605s ]
  6. SELECT * FROM `set` [ RunTime:0.000204s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000496s ]
  8. SELECT * FROM `article` WHERE `id` = 462403 LIMIT 1 [ RunTime:0.003054s ]
  9. UPDATE `article` SET `lasttime` = 1770566811 WHERE `id` = 462403 [ RunTime:0.006223s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000272s ]
  11. SELECT * FROM `article` WHERE `id` < 462403 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000403s ]
  12. SELECT * FROM `article` WHERE `id` > 462403 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.002542s ]
  13. SELECT * FROM `article` WHERE `id` < 462403 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.010537s ]
  14. SELECT * FROM `article` WHERE `id` < 462403 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.003750s ]
  15. SELECT * FROM `article` WHERE `id` < 462403 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.008601s ]
0.106615s