当前位置:首页>python>Python OOP 设计思想 09:协议优于继承

Python OOP 设计思想 09:协议优于继承

  • 2026-02-01 12:01:20
Python OOP 设计思想 09:协议优于继承

多态、接口稳定性和可替换性,更多依赖协议而非继承体系。协议是 Python 面向对象设计的核心支撑机制,其理念源自动态行为约定,而非形式化类型层级。

9.1 协议的本质含义

协议(Protocol)在 Python 中,是一组行为约定。

# 一个读取协议:任何有 read() 方法的对象都符合def process_data(source):    """source 只需符合读取协议"""    return source.read()# 各种不同类型但符合协议的对象class File:    def read(self):        return "file data"class NetworkStream:    def read(self):        return "network data"class MemoryBuffer:    def read(self):        return "buffer data"# 都能使用,无需共同基类process_data(File())process_data(NetworkStream())process_data(MemoryBuffer())

上述示例刻意避免任何共同基类或类型声明,其目的在于强调:协议不是类型结构,而是调用方在特定语境中的行为假设

process_data() 并未询问 source 是什么类型,也不关心它来自哪个继承体系,而只是提出一个最小要求:对象必须提供 read() 行为。

只要这一行为在调用点成立,对象就被视为“符合协议”。

在这一模型中,接口的边界由调用方定义,而不是由实现方预先声明。

协议因此成为一种以使用为中心的接口观,而非以类型为中心的设计。

协议的关键特征:

• 无需显式声明

• 基于行为而非身份

• 支持灵活替换与演化

9.2 鸭子类型的协议实践

鸭子类型是协议思想在 Python 中最直观的表现形式。

# 鸭子类型:关注行为而非类型class RealDuck:    def quack(self):        return "Quack!"class ToyDuck:    def quack(self):        return "Squeak!"class Person:    def quack(self):    # 人也可能"嘎嘎叫"        return "I'm pretending to be a duck!"def make_quack(thing):    """任何能 quack 的东西都能用"""    return thing.quack()# 不同类型,相同行为make_quack(RealDuck())    # "Quack!"make_quack(ToyDuck())     # "Squeak!"make_quack(Person())      # "I'm pretending to be a duck!"

在上述示例中,make_quack() 对“什么是鸭子”并无任何类型判断,它只隐含一个约定:能 quack 的就是鸭子。

这一约定既不需要继承,也不需要显式声明,而是在调用发生时即时验证。

这种设计方式的关键不在于“是否安全”,而在于将接口判断推迟到使用现场。

对象是否合格,不由其身份决定,而由其在该语境中的行为表现决定。

鸭子类型并不是放弃接口,而是将接口从类型系统中解放出来。

鸭子类型的价值在于:

• 最大化实现自由度:对象可以来自任何类型体系

• 降低接口耦合:无需复杂的继承层次

• 自然支持演化:新类型可以轻松加入

9.3 非显式接口的力量

在静态语言中,接口通常是显式声明的类型结构。而在 Python 中,接口的力量往往来自非显式协议。

# 上下文管理器协议:任何有 __enter__() 和 __exit__() 方法的对象def use_resource(resource):    """ resource 只需符合上下文管理器协议"""    with resource:  # 调用 __enter__() 和 __exit__()        return resource.operate()# 各种上下文管理器class DatabaseConnection:    def __enter__(self):        self.connect()        return self    def __exit__(self, exc_type, exc_val, exc_tb):        self.disconnect()    def operate(self):        return "database operation"class FileHandler:    def __init__(self, path):        self.path = path    def __enter__(self):        self.file = open(self.path)        return self    def __exit__(self, exc_type, exc_val, exc_tb):        self.file.close()    def operate(self):        return self.file.read()# 都符合协议,都能使用use_resource(DatabaseConnection())use_resource(FileHandler())

上下文管理器示例展示了一类典型的 Python 协议:由语法触发的隐式接口。

with resource: 并不要求 resource 继承自某个基类,它只假定对象能够响应 __enter__() 与 __exit__()。这一假定完全由语言语法提出,而非由类型系统强制。

这种接口的力量在于:

• 接口由使用方式定义

• 实现只需对使用作出回应

• 新对象可以在不修改任何既有代码的前提下加入系统

接口因此不再是静态声明,而是语言行为的一部分。

9.4 协议与接口稳定性

虽然协议是动态的,但接口稳定性仍然可以得到保障。

# 迭代协议:任何有 __iter__() 方法的对象def process_items(container):    """稳定的迭代接口"""    for item in container:  # 依赖 __iter__() 协议        print(f"Processing: {item}")# 不同实现,相同协议class ListContainer:    def __init__(self, items):        self.items = items    def __iter__(self):        return iter(self.items)class GeneratorContainer:    def __init__(self, max_value):        self.max = max_value    def __iter__(self):        for i in range(self.max):            yield iclass CustomContainer:    def __iter__(self):        # 自定义迭代逻辑        yield from ["a""b""c"]# 所有容器都工作,接口稳定process_items(ListContainer([123]))process_items(GeneratorContainer(5))process_items(CustomContainer())

迭代协议示例表明:接口稳定性并不依赖继承结构,而依赖使用约定的长期一致性。

for item in container: 只提出一个要求:对象必须是可迭代的。

这一要求在 Python 中已经高度稳定,其稳定性来自语言层面的共识,而非某个抽象父类。

不同容器实现可以自由演化其内部结构,只要持续满足迭代协议,调用方代码就无需改变。这使得接口稳定性建立在行为约定之上,而不是建立在类型冻结之上。

协议的优势在于:

• 允许对象自由演化

• 提供最小且稳定的多态契约

• 避免继承带来的隐性耦合

9.5 typing.Protocol 的静态支持

从 Python 3.8 开始,标准库提供了 typing.Protocol,在静态类型检查中显式支持协议概念。

from typing import Protocol, runtime_checkable@runtime_checkable    # 仅用于支持 isinstance / issubclass 的运行期检查,不影响 Protocol 的静态语义。class Readable(Protocol):    def read(self, size: int = -1) -> bytes: ...    def close(self) -> None: ...
# 实现协议(无需继承)class NetworkStream:    def read(self, size: int = -1) -> bytes:        return self.socket.recv(size if size > 0 else 4096)    def close(self) -> None:        self.socket.close()
# 使用协议进行类型标注def read_all(source: Readable) -> bytes:    data = source.read()    source.close()    return data# 运行时依然完全基于行为read_all(NetworkStream())read_all(open("file.txt""rb"))    # 文件对象同样符合 Readable 协议

typing.Protocol 的引入,并不是为了改变 Python 的运行时多态模型,而是为已经存在的协议式设计补充一种“可被理解与检查的语言”。

在没有 typing.Protocol 之前,鸭子类型完全依赖约定:

对象是否“可用”,只能通过运行时调用来验证。这种方式对动态系统极其友好,但对大型代码库而言,接口边界往往只能存在于文档或经验中。

typing.Protocol 的出现,解决的正是这一层问题:

• 它不要求实现类继承任何父类

• 它不参与 MRO,也不影响运行时行为

• 它不会改变 Python 的“行为优先”立场

相反,typing.Protocol 做的事情非常克制,它只是把“在此使用语境中,被假定存在的行为”显式表达出来。

class Readable(Protocol):    def read(self, size: int = -1) -> bytes: ...    def close(self) -> None: ...

这里的 Readable 并不是“谁是谁的子类”,而是对调用方的一种声明:凡是被当作 Readable 使用的对象,调用点将依赖这些行为。

这使得接口第一次具备了三重可见性:

• 对阅读代码的人:明确依赖的最小能力集合

• 对静态检查器:可验证的行为边界

• 对实现者:无需继承、无需注册、只需履约

因此,typing.Protocol 并不是“另一种接口类”,而是对鸭子类型的形式化补充,它让协议从“隐含共识”上升为“可表达但不具约束力的契约”。

这也正是 Python 的一贯立场:接口用于说明与协作,而不是用于限制与管控。

9.6 魔术方法与运算符重载接口

在 Python 中,魔术方法(dunder methods)并不是“语言技巧”,而是一类由语法与运算符触发的隐式接口。这些接口并非通过继承声明,而是通过使用方式自然成立。

当代码出现如下表达式时:

a + b

调用方并未关心 a 的类型层级,而只是隐式提出了一个接口需求:

• 对象是否支持 __add__()

• 运算结果是否具有合理语义

class Vector:    def __init__(self, x, y):        self.x = x        self.y = y    def __add__(self, other):        return Vector(self.x + other.x, self.y + other.y)    def __repr__(self):        return f"Vector({self.x}, {self.y})"    a = Vector(3,5)b = Vector(10,9)print(a + b)    # 输出:Vector(13, 14)

只要对象对该使用场景作出正确响应,它就自然满足了“加法接口”。

同样的机制适用于:

• __len__() → len(obj)

• __getitem__() → obj[index]

• __eq__() → obj1 == obj2

• __call__() → obj()

这些接口并非通过显式声明“被实现”,而是在语法使用中被调用、被验证、被确认

运算符重载的本质并不是扩展语法能力,而是让对象融入既有的使用语言。对象通过响应这些魔术方法,主动适配调用方的表达方式,而不是要求调用方理解其内部结构。

这再次印证了 Python 的接口哲学:接口不是通过继承体系获得的身份,而是通过使用行为达成的协作关系。

📘 小结

在 Python 中,接口并不源自继承结构,而源自使用语境中的行为约定。协议通过最小行为集定义可替换性,使对象在不共享类型身份的前提下协作。鸭子类型、魔术方法与 typing.Protocol 共同构成了这一体系:接口由使用提出,由行为验证,而非由继承赋权。这种设计使系统在演化中保持灵活、稳定且低耦合。

点赞有美意,赞赏是鼓励

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 19:58:22 HTTP/2.0 GET : https://f.mffb.com.cn/a/461211.html
  2. 运行时间 : 0.315966s [ 吞吐率:3.16req/s ] 内存消耗:4,534.39kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=8055f9acd36dfba7d01ea3d463c9bed7
  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.000810s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001012s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.014240s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000297s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000690s ]
  6. SELECT * FROM `set` [ RunTime:0.000355s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000694s ]
  8. SELECT * FROM `article` WHERE `id` = 461211 LIMIT 1 [ RunTime:0.012672s ]
  9. UPDATE `article` SET `lasttime` = 1770551902 WHERE `id` = 461211 [ RunTime:0.019015s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.004480s ]
  11. SELECT * FROM `article` WHERE `id` < 461211 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.004818s ]
  12. SELECT * FROM `article` WHERE `id` > 461211 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000512s ]
  13. SELECT * FROM `article` WHERE `id` < 461211 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.025029s ]
  14. SELECT * FROM `article` WHERE `id` < 461211 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.042743s ]
  15. SELECT * FROM `article` WHERE `id` < 461211 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.080164s ]
0.318270s