当前位置:首页>python>Python面向对象设计原则:SOLID原则实战指南

Python面向对象设计原则:SOLID原则实战指南

  • 2026-02-28 01:12:52
Python面向对象设计原则:SOLID原则实战指南

嘿,学习搭子!咱们已经学会了类和对象的基本用法,现在是不是感觉代码写得越来越顺手了?不过你有没有发现,随着项目变大,代码容易变得像一团乱麻,改一处牵动全身?

这时候,设计原则就像编程世界的“交通规则”,让咱们的代码既安全又高效。今天,我就带你认识面向对象设计的五大核心原则——SOLID原则。别被这个名字吓到,其实它们特别贴近实际开发,学完你就能写出更优雅、更易维护的代码!

1. 单一职责原则 (Single Responsibility Principle, SRP)

核心思想:一个类只做一件事

想象一下,如果你家的洗衣机既能洗衣服、又能做饭、还能扫地,听起来很方便对吧?但实际上,这种“多功能”机器往往哪个功能都做不好,而且坏了特别难修。

在编程中也是同理。一个类应该只有一个引起它变化的原因。换句话说,一个类只负责一项职责。

代码示例:违反 vs 遵循

违反SRP的代码

classUserManager:"""既管理用户数据,又发送邮件,还处理日志——职责过多!"""def__init__(self, username):self.username = usernamedefsave_to_database(self):# 保存用户到数据库print(f"用户{self.username}已保存到数据库")defsend_welcome_email(self):# 发送欢迎邮件print(f"向{self.username}发送欢迎邮件")deflog_activity(self, activity):# 记录用户活动日志print(f"日志:用户{self.username}进行了{activity}操作")# 随着功能增加,这个类会越来越臃肿...

问题所在

  • • 如果数据库结构变了,要修改这个类
  • • 如果邮件模板变了,也要修改这个类
  • • 如果日志格式变了,还是要修改这个类
  • • 一个地方出错,可能影响所有功能

遵循SRP的代码

classUser:"""只负责用户数据的表示"""def__init__(self, username):self.username = usernameclassUserRepository:"""只负责用户数据持久化"""defsave(self, user):print(f"用户{user.username}已保存到数据库")classEmailService:"""只负责发送邮件"""defsend_welcome_email(self, user):print(f"向{user.username}发送欢迎邮件")classLogger:"""只负责日志记录"""deflog(self, user, activity):print(f"日志:用户{user.username}进行了{activity}操作")# 使用示例user = User("小明")repo = UserRepository()email_service = EmailService()logger = Logger()repo.save(user)email_service.send_welcome_email(user)logger.log(user, "注册")

改进好处

  • • 每个类职责清晰,易于理解和维护
  • • 修改数据库逻辑时,只需改UserRepository
  • • 可以单独测试每个功能
  • • 便于复用:EmailService可以用于其他需要发邮件的场景

实际应用场景

何时使用SRP

  • • 当发现一个类的方法可以明显分组到不同功能时
  • • 当一个类需要频繁修改,但每次修改原因不同时
  • • 在团队协作中,需要明确分工时

常见误区

  • • 不要过度拆分,把简单的事情复杂化
  • • 一个类3-5个方法是比较合适的规模
  • • 如果两个职责总是同时变化,可以考虑放在一起

2. 开闭原则 (Open-Closed Principle, OCP)

核心思想:对扩展开放,对修改关闭

这个原则听起来有点矛盾,但其实很智慧。它说的是:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭

简单说就是:当需要添加新功能时,应该通过添加新代码来实现,而不是修改已有的代码

代码示例:违反 vs 遵循

违反OCP的代码

classAreaCalculator:"""计算各种图形的面积——每新增一种图形都要修改这个类"""defcalculate_area(self, shape):if shape["type"] == "circle":return3.14 * shape["radius"] * shape["radius"]elif shape["type"] == "rectangle":return shape["width"] * shape["height"]elif shape["type"] == "triangle":return0.5 * shape["base"] * shape["height"]# 每增加一种新图形,就要在这里加一个elif分支else:raise ValueError("不支持的图形类型")# 使用示例calculator = AreaCalculator()circle = {"type""circle""radius"5}rectangle = {"type""rectangle""width"4"height"6}print(f"圆面积:{calculator.calculate_area(circle)}")print(f"矩形面积:{calculator.calculate_area(rectangle)}")

问题所在

  • • 每次支持新图形都要修改calculate_area方法
  • • 修改可能引入bug,影响已有的功能
  • • 方法会越来越长,难以维护

遵循OCP的代码

from abc import ABC, abstractmethodclassShape(ABC):"""图形抽象基类"""    @abstractmethoddefarea(self):passclassCircle(Shape):def__init__(self, radius):self.radius = radiusdefarea(self):return3.14 * self.radius * self.radiusclassRectangle(Shape):def__init__(self, width, height):self.width = widthself.height = heightdefarea(self):returnself.width * self.heightclassTriangle(Shape):def__init__(self, base, height):self.base = baseself.height = heightdefarea(self):return0.5 * self.base * self.heightclassAreaCalculator:"""现在这个类对修改关闭,对扩展开放"""defcalculate_area(self, shape):return shape.area()# 使用示例calculator = AreaCalculator()circle = Circle(5)rectangle = Rectangle(46)triangle = Triangle(34)print(f"圆面积:{calculator.calculate_area(circle)}")print(f"矩形面积:{calculator.calculate_area(rectangle)}")print(f"三角形面积:{calculator.calculate_area(triangle)}")# 新增图形时,只需新增类,不用修改已有代码classEllipse(Shape):def__init__(self, a, b):self.a = aself.b = bdefarea(self):return3.14 * self.a * self.bellipse = Ellipse(53)print(f"椭圆面积:{calculator.calculate_area(ellipse)}")  # 无需修改AreaCalculator!

改进好处

  • • 新增功能时,原有代码保持稳定
  • • 降低回归测试的成本
  • • 代码结构更清晰,符合“高内聚、低耦合”

实际应用场景

何时使用OCP

  • • 当系统需要频繁添加新功能时
  • • 在框架或库的设计中特别重要
  • • 当修改已有代码风险较高时

实现技巧

  • • 使用抽象(接口或抽象类)
  • • 使用策略模式、模板方法模式
  • • 依赖注入

3. 里氏替换原则 (Liskov Substitution Principle, LSP)

核心思想:子类必须能够替换父类

这是Barbara Liskov提出的著名原则:如果S是T的子类型,那么程序中T类型的对象可以用S类型的对象替换,而不改变程序的正确性

说人话就是:子类应该像“增强版”的父类,而不是“变种”的父类。

代码示例:违反 vs 遵循

违反LSP的代码

classRectangle:def__init__(self, width, height):self.width = widthself.height = heightdefset_width(self, width):self.width = widthdefset_height(self, height):self.height = heightdefarea(self):returnself.width * self.heightclassSquare(Rectangle):"""正方形继承矩形——看似合理,实则违反LSP"""def__init__(self, side):super().__init__(side, side)defset_width(self, width):self.width = widthself.height = width  # 这里改变了父类的行为!defset_height(self, height):self.height = heightself.width = height  # 这里改变了父类的行为!# 测试函数deftest_area(rectangle):"""这个函数期望Rectangle能正常工作"""    rectangle.set_width(5)    rectangle.set_height(4)    expected = 20# 5 * 4    actual = rectangle.area()assert actual == expected, f"期望{expected},实际{actual}"# 使用父类时正常rect = Rectangle(00)test_area(rect)  # 通过# 使用子类时出错!square = Square(0)test_area(square)  # 断言错误!实际得到16,不是20

问题所在

  • • Square改变了set_widthset_height的语义
  • • 父类的使用者(test_area函数)预期宽度和高度独立设置
  • • 子类破坏了父类的契约

遵循LSP的代码

classShape:"""使用更通用的基类"""    @abstractmethoddefarea(self):passclassRectangle(Shape):def__init__(self, width, height):self.width = widthself.height = heightdefarea(self):returnself.width * self.heightclassSquare(Shape):def__init__(self, side):self.side = sidedefarea(self):returnself.side * self.side# 或者:如果不需设置宽度/高度,可以这样设计classResizableRectangle(Rectangle):"""明确表示这是可调整大小的矩形"""defresize(self, width, height):self.width = widthself.height = height# 现在所有子类都能正确替换父类shapes = [Rectangle(54), Square(5)]for shape in shapes:print(f"图形面积:{shape.area()}")

改进好处

  • • 子类不会破坏父类的预期行为
  • • 多态性可以安全使用
  • • 代码更健壮,减少隐藏bug

实际应用场景

何时需要特别注意LSP

  • • 设计类继承层次时
  • • 使用多态和依赖注入时
  • • 编写通用算法时

LSP的核心要求

  1. 1. 前置条件不能强化:子类不能要求比父类更严格的条件
  2. 2. 后置条件不能弱化:子类不能提供比父类更弱的承诺
  3. 3. 不变量必须保持:父类的不变量(数据一致性)在子类中必须保持
  4. 4. 历史约束:子类不能添加父类没有的状态变化

4. 接口隔离原则 (Interface Segregation Principle, ISP)

核心思想:客户端不应该依赖它不需要的接口

这个原则说的是:多个特定客户端接口要好于一个通用接口。不要强迫客户端实现它们用不到的方法。

代码示例:违反 vs 遵循

违反ISP的代码

classWorker:"""一个庞大的接口,包含所有可能的工作"""    @abstractmethoddefwork(self):pass    @abstractmethoddefeat(self):pass    @abstractmethoddefsleep(self):pass    @abstractmethoddefcode(self):pass    @abstractmethoddefdesign(self):pass    @abstractmethoddeftest(self):passclassProgrammer(Worker):"""程序员被迫实现所有方法,即使有些用不到"""defwork(self):print("程序员在工作")defeat(self):print("程序员在吃饭")defsleep(self):print("程序员在睡觉")defcode(self):print("程序员在写代码")defdesign(self):  # 程序员可能不擅长设计,但被迫实现print("程序员在设计...(其实不擅长)")deftest(self):  # 也可能不是测试专家print("程序员在测试...(草草了事)")classDesigner(Worker):"""设计师也被迫实现所有方法"""# ... 类似地,设计师可能不擅长写代码

问题所在

  • • 客户端(Programmer)被迫依赖不需要的方法
  • • 接口改变时,所有客户端都要修改
  • • 产生“空实现”或抛出NotImplementedError

遵循ISP的代码

# 拆分为多个特定接口classWorkable:    @abstractmethoddefwork(self):passclassEatable:    @abstractmethoddefeat(self):passclassSleepable:    @abstractmethoddefsleep(self):passclassCodable:    @abstractmethoddefcode(self):passclassDesignable:    @abstractmethoddefdesign(self):passclassTestable:    @abstractmethoddeftest(self):pass# 程序员只需要实现相关的接口classProgrammer(Workable, Eatable, Sleepable, Codable):defwork(self):print("程序员在工作")defeat(self):print("程序员在吃饭")defsleep(self):print("程序员在睡觉")defcode(self):print("程序员优雅地写代码")classDesigner(Workable, Eatable, Sleepable, Designable):defwork(self):print("设计师在工作")defeat(self):print("设计师在吃饭")defsleep(self):print("设计师在睡觉")defdesign(self):print("设计师创作精美设计")classTester(Workable, Eatable, Sleepable, Testable):defwork(self):print("测试员在工作")defeat(self):print("测试员在吃饭")defsleep(self):print("测试员在睡觉")deftest(self):print("测试员进行全面测试")# 使用示例programmer = Programmer()designer = Designer()tester = Tester()programmer.code()  # 程序员专注写代码designer.design()  # 设计师专注设计tester.test()      # 测试员专注测试# 每个类只关注自己的核心能力

改进好处

  • • 客户端只依赖需要的接口
  • • 接口更小、更专注
  • • 更容易理解、实现和维护
  • • 减少接口之间的耦合

实际应用场景

何时使用ISP

  • • 当接口变得臃肿时
  • • 当不同客户端需要接口的不同子集时
  • • 在设计插件系统或框架时

实现方式

  • • 接口继承(多个小接口)
  • • 适配器模式
  • • 默认方法(Python 3.4+的@abstractmethod

5. 依赖倒置原则 (Dependency Inversion Principle, DIP)

核心思想:依赖抽象,而不是具体实现

这是SOLID的最后一个原则,也是最重要之一:高层模块不应该依赖低层模块,两者都应该依赖抽象。抽象不应该依赖细节,细节应该依赖抽象

代码示例:违反 vs 遵循

违反DIP的代码

classLightBulb:"""具体的灯泡类"""defturn_on(self):print("灯泡亮了")defturn_off(self):print("灯泡灭了")classSwitch:"""开关直接依赖具体的灯泡类"""def__init__(self):self.bulb = LightBulb()  # 直接依赖具体实现defoperate(self, state):if state == "on":self.bulb.turn_on()elif state == "off":self.bulb.turn_off()# 问题:如果我想换LED灯怎么办?要修改Switch类classLEDLight:defturn_on(self):print("LED灯亮了")defturn_off(self):print("LED灯灭了")# Switch不能直接使用LEDLight,必须修改代码

问题所在

  • • Switch紧耦合于LightBulb
  • • 难以替换为其他类型的灯
  • • 违反开闭原则

遵循DIP的代码

from abc import ABC, abstractmethodclassSwitchable(ABC):"""抽象接口:可开关的设备"""    @abstractmethoddefturn_on(self):pass    @abstractmethoddefturn_off(self):passclassLightBulb(Switchable):"""具体实现:灯泡"""defturn_on(self):print("💡 灯泡亮了")defturn_off(self):print("💡 灯泡灭了")classLEDLight(Switchable):"""具体实现:LED灯"""defturn_on(self):print("🔦 LED灯亮了")defturn_off(self):print("🔦 LED灯灭了")classFan(Switchable):"""具体实现:风扇"""defturn_on(self):print("🌀 风扇转了")defturn_off(self):print("🌀 风扇停了")classSwitch:"""开关依赖抽象接口,而不是具体实现"""def__init__(self, device: Switchable):  # 依赖注入self.device = devicedefoperate(self, state):if state == "on":self.device.turn_on()elif state == "off":self.device.turn_off()# 使用示例:可以轻松切换不同设备bulb = LightBulb()led = LEDLight()fan = Fan()switch1 = Switch(bulb)switch2 = Switch(led)switch3 = Switch(fan)switch1.operate("on")  # 输出:💡 灯泡亮了switch2.operate("on")  # 输出:🔦 LED灯亮了switch3.operate("on")  # 输出:🌀 风扇转了# 新增设备类型时,无需修改Switch类classHeater(Switchable):defturn_on(self):print("🔥 加热器启动了")defturn_off(self):print("🔥 加热器关闭了")heater = Heater()switch4 = Switch(heater)switch4.operate("on")  # 输出:🔥 加热器启动了

改进好处

  • • 高层模块(Switch)不依赖低层模块的具体实现
  • • 系统更灵活,易于扩展和维护
  • • 便于单元测试(可以注入模拟对象)

实际应用场景

何时使用DIP

  • • 当模块需要支持多种实现时
  • • 在需要解耦的系统中
  • • 在需要可测试性的代码中

实现方式

  • • 依赖注入(构造函数注入、属性注入)
  • • 服务定位器模式
  • • 控制反转容器

6. 综合应用:SOLID原则实战指南

6.1 SOLID原则的相互关系

你发现没,这五个原则其实是相互支撑的:

  • • SRP是基础:一个类职责单一,才容易扩展(OCP)和替换(LSP)
  • • OCPLSP保证了继承体系的稳定性
  • • ISP让接口更精细,便于实现DIP
  • • DIP是最终目标:通过抽象实现松耦合

6.2 实际开发中的权衡

在真实项目中,咱们不可能100%遵循所有原则,需要权衡:

何时可以放松

  • • 小型工具脚本:过度设计反而增加复杂度
  • • 原型开发:快速验证想法更重要
  • • 内部使用的一次性代码

何时必须严格

  • • 核心业务逻辑
  • • 公共库和框架
  • • 长期维护的项目
  • • 团队协作的大型项目

6.3 渐进式改进

记住,设计原则不是一次性任务,而是持续改进的过程:

  1. 1. 先让代码工作:功能正确是第一位的
  2. 2. 识别痛点:当修改困难、bug频发时,回顾SOLID原则
  3. 3. 小步重构:每次只改进一个最痛的点
  4. 4. 保持测试:确保重构不破坏原有功能

6.4 练习:重构这个代码

看看下面的代码,它违反了哪些SOLID原则?试着改进它:

classReportGenerator:defgenerate_report(self, data, report_type):if report_type == "pdf":# 生成PDF报告self.generate_pdf(data)self.send_email(data, "pdf")self.save_to_database(data, "pdf")elif report_type == "excel":# 生成Excel报告self.generate_excel(data)self.send_email(data, "excel")self.save_to_database(data, "excel")elif report_type == "html":# 生成HTML报告self.generate_html(data)self.send_email(data, "html")self.save_to_database(data, "html")defgenerate_pdf(self, data):print("生成PDF报告")defgenerate_excel(self, data):print("生成Excel报告")defgenerate_html(self, data):print("生成HTML报告")defsend_email(self, data, report_type):print(f"发送{report_type}报告邮件")defsave_to_database(self, data, report_type):print(f"保存{report_type}报告到数据库")

思考一下

  1. 1. 这个类违反了哪个原则最严重?
  2. 2. 你会如何拆分这个类?
  3. 3. 如何让它更容易扩展新报告类型?

(答案可以在咱们的代码库中找到,或者你自己动手试试!)

7. 总结:从原则到习惯

学习搭子,今天咱们一口气学了五个设计原则,是不是感觉信息量有点大?别担心,你不需要一下子全部记住。最重要的是理解它们背后的思想:

  1. 1. SRP:专注才能专业
  2. 2. OCP:拥抱变化,但不破坏稳定
  3. 3. LSP:继承是“增强”,不是“变异”
  4. 4. ISP:小而美的接口
  5. 5. DIP:面向抽象编程

这些原则不是教条,而是经验总结。刚开始你可能有意识地检查自己的代码,但慢慢地,它们会成为你的编程直觉。

给初学者的建议

  1. 1. 从模仿开始:多读优秀开源项目的代码
  2. 2. 小步前进:每次只关注改进一个方面
  3. 3. 不怕犯错:即使违反了原则,只要代码能工作,就是进步
  4. 4. 定期回顾:过段时间回头看自己的代码,会有新的感悟

记住,最好的学习方式是动手。试着用今天学的原则改进你之前的项目,或者重构咱们图书管理系统的某个部分。

面向对象设计是一门艺术,需要时间和实践来掌握。但只要你持续练习,总有一天你会写出让自己都惊叹的优雅代码!

加油,咱们下次见! 🚀

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-28 17:55:42 HTTP/2.0 GET : https://f.mffb.com.cn/a/477309.html
  2. 运行时间 : 0.122699s [ 吞吐率:8.15req/s ] 内存消耗:4,566.10kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=47ec0f64871fdf235398e84b715f1920
  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.000372s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000586s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000268s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000317s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000479s ]
  6. SELECT * FROM `set` [ RunTime:0.000229s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000494s ]
  8. SELECT * FROM `article` WHERE `id` = 477309 LIMIT 1 [ RunTime:0.000959s ]
  9. UPDATE `article` SET `lasttime` = 1772272542 WHERE `id` = 477309 [ RunTime:0.004417s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000217s ]
  11. SELECT * FROM `article` WHERE `id` < 477309 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000484s ]
  12. SELECT * FROM `article` WHERE `id` > 477309 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000593s ]
  13. SELECT * FROM `article` WHERE `id` < 477309 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.028449s ]
  14. SELECT * FROM `article` WHERE `id` < 477309 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.005360s ]
  15. SELECT * FROM `article` WHERE `id` < 477309 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.005681s ]
0.125219s