当前位置:首页>python>Python OOP 设计思想 17:可读性是接口语义的一部分

Python OOP 设计思想 17:可读性是接口语义的一部分

  • 2026-02-05 19:18:40
Python OOP 设计思想 17:可读性是接口语义的一部分

在传统编程理论中,接口通常被简化为技术契约:一组可调用的方法、参数列表与返回值约定。然而,从 Python 的设计视角看,这样的理解是不完整且片面的

Python 认为,接口不仅是程序组件之间的通信协议,更是人与代码之间的沟通语言。一个设计良好的接口应该像自然语言一样,自解释、无歧义、易理解

17.1 接口不仅是技术契约

从技术角度看,接口定义了:

• 可以调用什么

• 需要提供什么

• 会返回什么

但从使用角度看,接口还隐含着:

• 使用者应如何理解它

• 应在什么语境下使用

• 哪些行为是“被鼓励的”

示例:技术契约 vs 语义契约

# 技术上可用,语义上困惑class Processor:    def p(self, d):        """糟糕:无法理解 p 和 d 的含义"""        return d * 2
# 语义清晰的接口class OrderProcessor:    def calculate_total(self, order_items: list[tuple[floatint]]) -> float:        """        计算订单总金额 - 清晰的语义契约        Args:            order_items: 商品列表,每个元素为 (单价, 数量)        Returns:            订单总金额        """        total = 0.0        for unit_price, quantity in order_items:            total += unit_price * quantity        return total
# 使用对比processor = Processor()result = processor.p(100)    # 100是什么?结果200代表什么?order_processor = OrderProcessor()items = [(29.992), (15.501)]total = order_processor.calculate_total(items)    # 一目了然

接口的完整定义应当包含两个层面:

1、技术层面(Technical Contract)

• 方法签名:名称、参数、返回值

• 类型约束:参数类型、返回值类型

• 异常约定:可能抛出的异常类型

2、语义层面(Semantic Contract)

• 意图表达:方法要完成什么业务目标

• 上下文关联:在什么业务场景下使用

• 行为预期:调用会产生什么效果

• 使用约束:前提条件和后置条件

如果接口技术上可用,但语义上令人困惑,那么它在设计上仍是不完整的。一个完整的接口设计必须同时考虑机器可执行性和人类可理解性。

17.2 可读性影响使用方式

可读性不是接口的装饰性属性,而是直接影响接口使用效果的功能属性。一个可读性差的接口会导致误用、错误和认知负担

(1)命名作为使用指南

# 模糊的接口:迫使调用者猜测def process(x):    """❌ 模糊命名:x 是什么?处理什么?返回什么?"""    return json.dumps(x)# 清晰的接口:自解释的使用指南def serialize_to_json(data: dict) -> str:    """✅ 清晰命名:序列化字典为 JSON 字符串"""    return json.dumps(data)# 使用对比serialized = process(some_data)    # ❌ 需要查看文档或源码才能理解serialized = serialize_to_json(user_data)    # ✅ 从方法名即可理解功能和用法

(2)参数命名的语义价值

# 不清晰的参数命名:引发误用def connect(host, port, db, usr, pwd):    """❌ 缩写造成理解负担,必须查看文档"""    pass# 清晰的参数命名:自解释的接口def connect_to_database(    hostname: str    port: int    database: str    username: str    password: str) -> Connection:    """✅ 完整名称:每个参数的含义一目了然"""    pass# 使用对比# ❌ 糟糕:必须记住参数顺序和含义connect("localhost"5432"mydb""admin""secret")# ✅ 良好:关键字参数增强可读性connect_to_database(    hostname="localhost",    port=5432,    database="mydb",    username="admin",    password="secret")

(3)良好可读性的实际影响

• 减少认知负担

• 降低文档依赖

• 提高使用准确性

• 加速代码审查

• 便于代码搜索

接口如何被“读懂”,往往决定了它如何被“用对”。一个容易被误解的接口,无论技术实现多么完美,都会在实际使用中引发问题

17.3 命名即接口

在 Python 中,命名不是实现细节,而是接口设计的重要组成部分。合理的命名可以让调用者无需阅读实现代码就能理解行为,这是优秀接口设计的标志

(1)方法命名的语义层次

# 不同级别的操作语义def open_file(filepath: str) -> TextIOWrapper:    """✅ 操作级:打开文件,返回文件对象"""    return open(filepath)def read_file(filepath: str) -> str:    """✅ 结果级:读取文件内容,返回字符串"""    with open(filepath) as f:        return f.read()def load_config(filepath: str) -> dict:    """✅ 业务级:加载配置,返回解析后的字典"""    with open(filepath) as f:        return json.load(f)def fetch_remote_data(url: str) -> dict:    """✅ 来源级:获取远程数据,暗示网络操作"""    response = requests.get(url)    return response.json()def validate_user_input(data: dict) -> bool:    """✅ 验证级:验证用户输入,返回布尔结果"""    return all(key in data for key in ['username''email'])

(2)属性命名的语义传递

class User:    """用户类:通过属性命名传递丰富的语义信息"""    def __init__(self):        # 内部实现细节(约定:单下划线开头)        self._password_hash = ""   # 暗示:经过哈希处理的密码,不存储明文        self._session_token = ""   # 暗示:会话令牌,需要安全处理        # 公开属性(业务语义清晰)        self.username = ""          # 用户标识        self.email = ""             # 联系方式        self.display_name = ""      # 展示名称        # 状态属性(布尔值表达状态)        self.is_active = True       # 账户是否激活        self.is_verified = False    # 邮箱是否验证        self.is_locked = False      # 账户是否锁定        # 时间属性(清晰的时态表达)        self.created_at = None      # 创建时间        self.updated_at = None      # 更新时间        self.last_login_at = None   # 最后登录时间        # 计数属性(明确的计量单位)        self.login_count = 0        # 登录次数        self.failed_attempts = 0    # 失败尝试次数        # 关系属性(表达对象关联)        self.profile = UserProfile()       # 一对一关系        self.permissions = []              # 一对多关系

(3)命名的设计原则

• 动词-名词模式:操作方法使用动词开头,如 calculate_total, validate_input

• 状态描述模式:布尔属性使用 is_, has_, can_ 前缀,如 is_enabled

• 时间表达模式:时间属性使用 _at, _date, _time 后缀,如 created_at

• 集合表达模式:列表属性使用复数形式,如 items, permissions

• 计算属性模式:派生属性使用名词形式,如 subtotal, full_name

糟糕的命名迫使使用者不断在代码和文档之间跳转,而良好的命名让实现细节退居幕后,使接口的语义意图成为关注焦点。当命名足够清晰时,调用者甚至不需要知道接口是如何实现的,只需要知道它能做什么。

17.4 代码风格与设计哲学

Python 将代码风格视为设计哲学的重要组成部分,而非仅仅停留在表面形式。风格混乱的接口,即便技术上稳定可靠,也会削弱使用者的信任感和理解效率。

示例:风格混乱 vs 风格一致

# 风格混乱:分散注意力,增加认知负担class Calculator:    def add(self,x,y):           # ❌ 缺少空格        return x+y               # ❌ 运算符周围缺少空格    def subtract(self,x,y):        return x - y             # ✅ 减法正确,但风格不一致    def multiply(self, x, y):        return x* y              # ❌ 乘法运算符格式混乱    def divide(self,x,y):        return x/y if y!=0 else None  # ❌ 条件表达式混乱# 风格一致:专注业务逻辑,降低理解成本class Calculator:    """计算器类:通过一致风格建立使用信任"""    def add(self, x: float, y: float) -> float:        """返回两个数的和        Args:            x: 第一个加数            y: 第二个加数        Returns:            两个数的和        """        return x + y    def subtract(self, x: float, y: float) -> float:        """返回两个数的差        Args:            x: 被减数            y: 减数        Returns:            两个数的差        """        return x - y    def multiply(self, x: float, y: float) -> float:        """返回两个数的积        Args:            x: 被乘数            y: 乘数        Returns:            两个数的乘积        """        return x * y    def divide(self, x: float, y: float) -> float:        """返回两个数的商        Args:            x: 被除数            y: 除数        Returns:            两个数的商        Raises:            ValueError: 除数为零时抛出异常        """        if y == 0:            raise ValueError("除数不能为零")        return x / y

一致的代码风格不是形式主义,而是降低认知负荷的设计策略。

Python 通过 PEP 8 等风格指南,将主观的审美偏好转化为客观的质量标准。这种转换使得代码可读性从“个人习惯”升级为“团队共识”,从“风格偏好”进化为“设计规范”。

17.5 人是接口的最终使用者

接口的最终受众是人,开发者是第一批使用者,维护者是长期使用者。优秀的接口设计必须考虑人的认知特性和协作需求。接口应考虑可理解性、可维护性和团队协作。

示例:以开发者为中心的设计

class Configuration:    """配置管理类:以开发者体验为中心的设计"""    def __init__(self):        # 层次化组织:符合心智模型        self.database = DatabaseConfig()        self.api = ApiConfig()        self.cache = CacheConfig()        self.logging = LoggingConfig()        self.security = SecurityConfig()        # 智能默认值:减少配置负担        self.timeout = 30        self.retry_attempts = 3        self.enable_cache = True        # 语义化常量:避免魔法数字        self.log_level = LogLevel.INFO        self.env = Environment.DEVELOPMENT    # 流畅接口设计:支持链式调用    def with_database(self, host: str, port: int) -> "Configuration":        """设置数据库配置(流畅接口模式)"""        self.database.host = host        self.database.port = port        return self  # 返回self支持链式调用    def with_timeout(self, seconds: int) -> "Configuration":        """设置超时时间"""        self.timeout = seconds        return self    # 使用示例:直观且流畅    # config = Configuration() \    #     .with_database("localhost", 5432) \    #     .with_timeout(60) \    #     .with_logging(LogLevel.DEBUG)

合理的接口设计应:

• 提供自解释的属性和方法

• 考虑参数顺序、默认值、类型提示和返回值

Python 的核心判断是:如果人无法轻松理解和使用接口,那么接口本身的设计就尚未完成。优秀的接口应该让正确的使用方式成为最自然、最明显的选择。

17.6 自解释接口与文档化实践

自解释接口并不意味着“不需要文档”,而是意味着:接口本身已经承担了主要的解释责任,文档只用于补充边界条件、使用示例和设计意图等辅助信息

一个接口如果必须依赖长篇说明才能被正确使用,往往意味着其命名、结构或语义本身存在问题。

自解释接口通常具备以下特征:

• 方法与属性名称即表达业务含义

• 参数顺序符合使用直觉

• 返回值语义稳定、可预测

• 错误路径清晰,可通过异常理解失败原因

在此基础上,文档化的作用是:

• 明确边界条件与异常语义

• 提供典型用法与反例

• 强化团队对接口语义的共识

class ReportGenerator:    def generate_summary(self, records: list[Record]) -> Summary:        """        生成汇总报告        Args:            records: 原始记录列表        Returns:            汇总结果对象        Raises:            ValueError: 当记录为空时        """        if not records:            raise ValueError("records cannot be empty")        ...

在这样的接口中,即便不阅读文档,调用者也能正确判断:

• 该方法做什么

• 需要什么输入

• 大致会得到什么结果

文档在这里承担的是确认语义,而非解释语义。

17.7 实践:编写自解释的接口

编写自解释接口,本质上是一种替未来使用者提前思考的设计实践。

在 Python 中,这种实践往往体现为对以下问题的持续自问:

• 这个名字是否需要额外解释?

• 这个调用是否存在歧义?

• 这个返回值是否会让人困惑?

示例:以接口语义为中心的设计

class Invoice:    """发票对象:以接口语义为中心的设计"""    def __init__(self, number: str):        self.number = number        self._items: list[InvoiceItem] = []    def add_item(self, description: str, quantity: int, unit_price: float) -> None:        """添加发票项目(描述、数量、单价)"""        self._items.append(            InvoiceItem(description, quantity, unit_price)        )    @property    def subtotal(self) -> float:        """不含税金额"""        return sum(item.total for item in self._items)    @property    def total(self) -> float:        """含税总金额"""        return self.subtotal * 1.08

调用代码几乎无需解释:

invoice.add_item("Keyboard"299.0)invoice.total

当接口足够清晰时:

• 使用者不必阅读实现

• 文档可以保持简洁

• 重构不会破坏语义认知

自解释接口的目标不是减少代码量,而是最大化代码的理解效率和长期可维护性。通过精心设计的接口,我们不是在编写今天的代码,而是在构建明天的可维护性。

📘 小结

在 Python 中,接口不仅是技术契约,更是人与代码之间的沟通语言。命名、结构与风格共同构成接口语义。可读性决定接口是否被正确使用,也决定其能否长期演化。接口若不能被自然读懂,设计便尚未完成

点赞有美意,赞赏是鼓励

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 19:23:37 HTTP/2.0 GET : https://f.mffb.com.cn/a/464439.html
  2. 运行时间 : 0.105344s [ 吞吐率:9.49req/s ] 内存消耗:5,126.64kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=ea85339eb20f18b817b6cb3aa7acee5e
  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.000398s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000656s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000279s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000268s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000621s ]
  6. SELECT * FROM `set` [ RunTime:0.000227s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000680s ]
  8. SELECT * FROM `article` WHERE `id` = 464439 LIMIT 1 [ RunTime:0.003401s ]
  9. UPDATE `article` SET `lasttime` = 1770549817 WHERE `id` = 464439 [ RunTime:0.007690s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000303s ]
  11. SELECT * FROM `article` WHERE `id` < 464439 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.003299s ]
  12. SELECT * FROM `article` WHERE `id` > 464439 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000829s ]
  13. SELECT * FROM `article` WHERE `id` < 464439 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002325s ]
  14. SELECT * FROM `article` WHERE `id` < 464439 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.005970s ]
  15. SELECT * FROM `article` WHERE `id` < 464439 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.010600s ]
0.106847s